国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

synchronized同步

2019-11-09 15:03:10
字體:
來源:轉載
供稿:網友

synchronized既可以對方法實現同步,也可以對代碼塊實現同步,示列如下:

// 未同步的方法public void test() {}// 同步的方法pubilc synchronized void test() {}//synchronized 也可以用在一個代碼塊上,看public void test() { synchronized(obj) { System.out.使用synchronized代碼塊,可以只對需要同步的代碼進行同步,這樣可以提高效率。 synchronized也可以配合Object對象的wait()/notify()/nitifyAll()一起使用。如下列子所示:

package jalonTest;/* Produce線程打印A,Consumer線程打印B。實現ABABAB交替打印。 模擬生產者生產數據后,喚醒消費者消費數據。*/public class Test { static class Consumer implements Runnable { public void run() { // TODO Auto-generated method stub int count = 10; while(count > 0) { synchronized (Test. obj) { try { Test. obj.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System. out.print( "B"); count --; Test. obj.notify(); // 主動釋放對象鎖 } } } } static class Produce implements Runnable { public void run() { // TODO Auto-generated method stub //想想這里為什么要休眠一會呢? try { Thread.sleep(1000); } catch (InterruptedException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } int count = 10; while(count > 0) { synchronized (Test. obj) { //System.out.print("count = " + count); System. out.print( "A"); count --; Test. obj.notify(); try { Test. obj.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } } public static final Object obj = new Object(); public static void main(String[] args) { new Thread( new Produce()).start(); new Thread( new Consumer()).start(); }}

Obj.wait(),與Obj.notify()必須要與synchronized(Obj)一起使用,也就是wait,與notify是針對已經獲取了Obj鎖進行操作,從語法角度來說就是Obj.wait(),Obj.notify必須在synchronized(Obj){…}語句塊內。從功能上來說wait就是說線程在獲取對象鎖后,主動釋放對象鎖,同時本線程休眠。直到有其它線程調用對象的notify()喚醒該線程,才能繼續獲取對象鎖,并繼續執行。相應的notify()就是對對象鎖的喚醒操作。但有一點需要注意的是notify()調用后,并不是馬上就釋放對象鎖的,而是在相應的synchronized(){}語句塊執行結束,自動釋放鎖后,JVM會在wait()對象鎖的線程中隨機選取一線程,賦予其對象鎖,喚醒線程,繼續執行。這樣就提供了在線程間同步、喚醒的操作。

想想在Produce線程中為什么要sleep一會?去掉試試,是否每次都能輸出ABABABAB呢? 若不休眠存在一種可能,Produce在notify完畢時,Consumer還沒進入wait狀態,那就沒得玩了。后續Produce會一直等待Consumer的notify而Consumer也在等待Produce的notify,這就是死鎖!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 延长县| 宿迁市| 阿拉尔市| 平舆县| 曲阳县| 墨竹工卡县| 昌都县| 凤庆县| 泰来县| 琼中| 肇源县| 建湖县| 泸西县| 合江县| 嘉祥县| 大石桥市| 双鸭山市| 专栏| 清水县| 延长县| 桂阳县| 鞍山市| 兴仁县| 四平市| 随州市| 青冈县| 平凉市| 漠河县| 武夷山市| 当雄县| 万源市| 蓬溪县| 镇巴县| 丹东市| 赤水市| 宾阳县| 喀什市| 河北省| 枣强县| 五台县| 绥芬河市|