亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

弄清java中的同步鎖

2019-11-06 06:59:00
字體:
來源:轉載
供稿:網友

今天來講一講java中的同步鎖,本文不對基本概念進行說明并且假定讀者已經知道鎖的基本用途?

鎖的作用:在多線程訪問同一數據時提供對數據的保護,防止數據被破壞或者不一致

本文目的:幫助讀者清晰的認識java中的同步鎖的相關知識,并能在程序中合理的使用

強烈建議自己嘗試動手用同步鎖實現一個生產者消費者模型再繼續往下看

生產者消費者簡單模型代碼參考:

public class Main{ List list = new ArrayList(); public static void main(String[] args) throws Exception { Main t = new Main(); Consumer consumer = t.new Consumer(); PRoducer producer = t.new Producer(); consumer.start(); producer.start(); } class Consumer extends Thread{ @Override public void run() { while (true) { synchronized (list) { if (list.size() > 0) { //如果list中有元素則消費掉 for(int i = 0 ;i < list.size();i++) { list.remove(i); System.out.println("消費1個"); } }else{ //如果list中沒有元素則喚醒其他等待線程,當前線程進入等待 list.notifyAll(); list.wait(); } } } } } class Producer extends Thread{ @Override public void run() { while (true) { synchronized (list) { if (list.size() == 0) { //如果list中沒有元素則生產 list.add(1); System.out.println("生產1個"); }else{ //如果有則喚醒其他線程執行,當前線程進入等待模式 list.notifyAll(); list.wait(); } } } } }

以上是生產者和消費者的簡單模型示例。

整個程序的思路就是啟動兩個線程,一個是資源的生產者Producer,一個是資源的消費者Consumer,資源的容器是一個list,代碼邏輯是如果生產者發現list中沒有資源,就新增一個,如果有的話線程則進入等待狀態,消費者恰好相反,如果有就消費,沒有就等待。

上面的程序是可以按照我們設想的思路進行的,控制臺會不斷的打印 生產1個,消費1個,生產1個,消費1個………. ,這里涉及到幾個知識點要注意

如果能夠清晰的理解上面每行代碼的作用,說明對同步鎖的用法和基本就掌握了,如果還不是特別清楚,下面我們來詳細的分析上面的代碼和涉及到的知識點

第一:要保證一個線程在操作list的時候其他線程不能對它進行操作,否則會出現數據不一致的情況,所以要對list進行加鎖處理,防止其他線程篡改

第二:關于 wait(),notify(),notifyAll()方法,簡單的說這幾個方法是讓當前線程等待和喚醒的方法,是Object類的方法,因為Object是所有類的父類,所以說所有的對象都有這個方法

wait() :讓當前線程去等待該對象的鎖,那究竟是誰的鎖呢?誰調用的就去獲取誰的鎖,比如說上面調用了 list.wait(), 這就表示讓當前線程去等待,要調用wait()方法是有要求的,要求是當前線程必須已經擁有了對象的鎖,才能調用wait()方法,這里有的讀者可能就有點暈了,既然要擁有鎖之后才能調用wait(), 那調用wait是要等待什么呢? 這就和下面的一個方法產生關聯了,調用wait(),就是等待另一個線程調用notify()方法。

notify() :這個方法和上面的wait是對應的,是用來喚醒等待該資源的線程,相當于說,哎,兄弟我要把鎖釋放了,你們拿去用吧!,然后其他某個的線程就獲取到了鎖去繼續干活兒了,還有一個方法叫notifyAll,作用好像是和notify一樣,從jdk的說明文檔中沒有清晰的看出區別,使用上效果好像是一樣的。

對象鎖、類鎖、synchronized同步方法,以及synchronized同步代碼塊究竟是什么?它們之間又之間是什么關系?

對象鎖和synchronzied方法,請看如下代碼

// java中每個對象都有一把同步鎖,obj1和obj2各有一把一把同步鎖Object obj1 = new Object();Object obj2 = new Object();

synchronized就是去獲取對象的同步鎖的意思,請看如下代碼

public void test1(){ synchronized(obj1){ System.out.println("執行了...."); }}

上面的代碼是要獲取obj1對象的鎖,如果obj1對象的鎖被其他的線程持有了,那程序就會一直停在synchronzied那里,直到獲取到obj1的鎖才往下執行

但我們經常看到的同步代碼是這樣

public class Main{ public synchronized void doInSyn(){ System.out.println("執行咯......."); }}

線程在執行doInSyn()方法時首先需要獲取當前對象的鎖才能執行,其實和下面這種寫法的效果是一樣

public class Main{ public void doInSyn(){ //代表先去獲取this對象的同步鎖才能執行 synchronized(this){ System.out.println("執行咯......."); } }}

相信到這里應該已經理解對象鎖了,但有時我們會看到如下的寫法

public static synchronized doInSync(){}

這里的synchronzied還是去獲取當前對象的同步鎖再執行的意思嗎?當然,答案是否定的,所以下面我們要講的是類的鎖,雖然名稱和對象鎖不一樣但其實原理是一樣的

Java中靜態方法是屬于類的,所以靜態方法的鎖也是類的鎖

Java中靜態方法是屬于類的,下面我們通過代碼來解釋

public class ClassLockTest extends Thread { public static void main(String[] args) { ClassLockTest t1 = new ClassLockTest(); t1.setName("T_One"); ClassLockTest t2 = new ClassLockTest(); t2.setName("T_Two"); t1.start(); t2.start(); } @Override public void run() { try { print(this.getName()); } catch (InterruptedException e) { e.printStackTrace(); } } public static synchronized void print(String threadName){ int count = 5; while(count-- > 0){ Thread.sleep(100); System.out.println(threadName + " "+count); } }}結果:T_One 4T_One 3T_One 2T_One 1T_One 0T_Two 4T_Two 3T_Two 2T_Two 1T_Two 0

我們可以看到雖然同時啟動了兩個線程去打印,但順序完全沒有亂,就是因為靜態同步方法 (static synchronized修飾)會先去獲取對象的鎖,然后再執行,如果沒有獲取到則會一直等待,直到其他線程執行結束釋放鎖

上面的方法等同于這種寫法

public static void print(String threadName) { synchronized(ClassLockTest.class){ int count = 5; while(count-- > 0){ Thread.sleep(100); System.out.println(threadName + " "+count); }}}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91精品久久久久久久久久久久久| 综合网中文字幕| 欧美老肥婆性猛交视频| 美女黄色丝袜一区| 91欧美精品成人综合在线观看| 亚洲国产精品一区二区久| 亚洲欧美在线磁力| 亚洲午夜精品久久久久久性色| 热re99久久精品国产66热| 日本精品一区二区三区在线播放视频| 91a在线视频| 日韩成人中文字幕在线观看| 亚洲天堂免费视频| 国产97免费视| 久久人人看视频| 亚洲黄页视频免费观看| 国产午夜精品全部视频在线播放| 91精品啪aⅴ在线观看国产| 久久69精品久久久久久久电影好| 亚洲欧洲日韩国产| 日本欧美国产在线| 国产精品91一区| 国产日本欧美视频| 国产一区香蕉久久| 日韩视频在线免费观看| 亚洲一区二区三区四区在线播放| 国产午夜精品全部视频播放| 亚洲一区二区久久久久久| 欧美与欧洲交xxxx免费观看| 欧美成人中文字幕| 亚洲精品国产综合久久| 久久精品国产视频| 伊人激情综合网| 欧美亚洲成人精品| 日韩视频免费看| 欧美精品激情在线| 亚洲2020天天堂在线观看| 国产成人鲁鲁免费视频a| 日韩av在线不卡| 午夜剧场成人观在线视频免费观看| 97在线观看免费高清| 日韩电影第一页| 国产精品美女久久久免费| 成人午夜小视频| 国产精品日韩欧美综合| www.日韩不卡电影av| 国产精品亚洲片夜色在线| 国产成人精品在线观看| 国产美女91呻吟求| 日本精品免费一区二区三区| 欧美乱妇高清无乱码| 亚洲大胆人体av| 亚洲免费电影在线观看| 欧美激情女人20p| 欧美日韩国产999| 国产成人亚洲精品| 国产69精品久久久久久| 最近2019免费中文字幕视频三| 欧美午夜影院在线视频| 97高清免费视频| 欧美成人精品一区二区| 午夜精品久久久久久久久久久久| 另类少妇人与禽zozz0性伦| 97精品伊人久久久大香线蕉| 91av在线国产| 黑人巨大精品欧美一区二区免费| 欧美激情久久久久久| 欧美黄色三级网站| 国产亚洲欧美视频| 欧美高清不卡在线| 亚洲欧美国产日韩天堂区| 欧美激情网友自拍| 亚洲bt欧美bt日本bt| 在线成人中文字幕| 亚洲精品福利资源站| 91久久精品久久国产性色也91| 久久精品夜夜夜夜夜久久| 国产香蕉一区二区三区在线视频| 成人黄色影片在线| 久久伊人91精品综合网站| 亚洲片国产一区一级在线观看| 亚洲欧美成人一区二区在线电影| 成人精品视频99在线观看免费| 日韩成人激情影院| 欧美中文在线字幕| 精品自拍视频在线观看| 91免费看片网站| 国产亚洲精品一区二555| 成人h视频在线| 国模私拍视频一区| 欧美亚洲另类在线| 一本一本久久a久久精品牛牛影视| 亚洲国产成人在线视频| 自拍偷拍免费精品| 伊人精品在线观看| 国产日韩在线看片| 国产a∨精品一区二区三区不卡| 精品久久久91| 国内揄拍国内精品| 欧美丰满少妇xxxxx| 亚洲免费视频一区二区| 精品中文字幕乱| 国产精品一区电影| 国产亚洲欧洲黄色| 欧美激情在线播放| 亚洲精品自拍视频| 成人激情在线播放| 国产精品久久久久久久av大片| 成人午夜在线视频一区| 91国产美女在线观看| 欧美亚洲视频在线看网址| 91极品女神在线| 亚洲精品国产精品自产a区红杏吧| 精品中文字幕视频| 亚洲电影在线观看| 日韩视频第一页| 在线午夜精品自拍| 国产999精品视频| 狠狠色狠狠色综合日日五| 国产精品三级美女白浆呻吟| 亚洲午夜精品久久久久久久久久久久| 91精品国产自产91精品| 亚洲社区在线观看| 2019精品视频| 精品福利在线看| 欧美一级黄色网| 日韩美女视频免费在线观看| 国产精品美女www爽爽爽视频| 一区二区国产精品视频| 亚洲成av人乱码色午夜| 精品亚洲国产视频| 日韩69视频在线观看| 欧美精品www在线观看| 懂色aⅴ精品一区二区三区蜜月| 国产精品久久999| 国产不卡视频在线| 91chinesevideo永久地址| 亚洲自拍另类欧美丝袜| 久久综合伊人77777蜜臀| 久久五月天综合| 成人国产精品日本在线| 欧美精品生活片| 91系列在线播放| 亚洲男人第一网站| 欧美一级bbbbb性bbbb喷潮片| 日韩麻豆第一页| 色狠狠av一区二区三区香蕉蜜桃| 色香阁99久久精品久久久| 欧美一区二区三区艳史| 成人在线一区二区| 国产精品视频永久免费播放| 欧美精品国产精品日韩精品| 麻豆国产va免费精品高清在线| 国产精品久久久久久久久久东京| 亚洲国产精品美女| 久久精品99久久香蕉国产色戒| 一区二区国产精品视频| 日韩欧美福利视频| 狠狠躁夜夜躁人人爽超碰91| 成人午夜在线观看| 粉嫩av一区二区三区免费野| 欧美成人午夜激情在线| 尤物99国产成人精品视频| 午夜精品一区二区三区在线|