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

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

synchronized和ReentrantLock區別

2019-11-09 13:43:30
字體:
來源:轉載
供稿:網友

sychronized

java中,每一個對象有且僅有一個同步鎖。這也意味著,同步鎖是依賴于對象而存在。 當我們調用某對象的synchronized方法時,就獲取了該對象的同步鎖。例如,synchronized(obj)就獲取了“obj這個對象”的同步鎖。 不同線程對同步鎖的訪問是互斥的。也就是說,某時間點,對象的同步鎖只能被一個線程獲取到!通過同步鎖,我們就能在多線程中,實現對“對象/方法”的互斥訪問。 例如,現在有兩個線程A和線程B,它們都會訪問“對象obj的同步鎖”。假設,在某一時刻,線程A獲取到“obj的同步鎖”并在執行一些操作;而此時,線程B也企圖獲取“obj的同步鎖” —— 線程B會獲取失敗,它必須等待,直到線程A釋放了“該對象的同步鎖”之后線程B才能獲取到“obj的同步鎖”從而才可以運行。

sychronized有三條原則: 1. 當一個線程訪問“某對象”的“synchronized方法”或者“synchronized代碼塊”時,其他線程對“該對象”的該“synchronized方法”或者“synchronized代碼塊”的訪問將被阻塞。 2. 當一個線程訪問“某對象”的“synchronized方法”或者“synchronized代碼塊”時,其他線程仍然可以訪問“該對象”的非同步代碼塊。 3. 當一個線程訪問“某對象”的“synchronized方法”或者“synchronized代碼塊”時,其他線程對“該對象”的其他的“synchronized方法”或者“synchronized代碼塊”的訪問將被阻塞。

synchronized會在進入同步塊的前后分別形成monitorenter和monitorexit字節碼指令.在執行monitorenter指令時會嘗試獲取對象的鎖,如果此沒對象沒有被鎖,或者此對象已經被當前線程鎖住,那么鎖的計數器加一,每當monitorexit被鎖的對象的計數器減一.直到為0就釋放該對象的鎖.由此synchronized是可重入的,不會出現自己把自己鎖死.

ReentrantLock

ReentrantLock是一個可重入的互斥鎖,又被稱為“獨占鎖”。

顧名思義,ReentrantLock鎖在同一個時間點只能被一個線程鎖持有;而可重入的意思是,ReentrantLock鎖,可以被單個線程多次獲取。 ReentrantLock分為 公平鎖非公平鎖 。它們的區別體現在獲取鎖的機制上是否公平。 是為了保護競爭資源,防止多個線程同時操作線程而出錯,ReentrantLock在同一個時間點只能被一個線程獲取(當某線程獲取到“鎖”時,其它線程就必須等待);ReentraantLock是通過一個FIFO的等待隊列來管理獲取該鎖所有線程的。在“公平鎖”的機制下,線程依次排隊獲取鎖;而“非公平鎖”在鎖是可獲取狀態時,不管自己是不是在隊列的開頭都會獲取鎖。 以對象的方式來操作對象鎖,相對于sychronized需要在finally中去釋放鎖。

synchronized和ReentrantLock的區別

除了synchronized的功能,多了三個高級功能。 等待可中斷,公平鎖,綁定多個Condition。 1. 等待可中斷:在持有鎖的線程長時間不釋放鎖的時候,等待的線程可以選擇放棄等待,tryLock(long timeout, TimeUnit unit) 2. 公平鎖:按照申請鎖的順序來一次獲得鎖稱為公平鎖,synchronized的是非公平鎖,ReentrantLock可以通過構造函數實現公平鎖。new RenentrantLock(boolean fair) 3. 綁定多個Condition:通過多次newCondition可以獲得多個Condition對象,可以簡單的實現比較負責的線程同步的功能,通過await(),signal();

實現消費者模式

sychronized

public static class Depot { PRivate int mCapacity; private int mSize; public Depot(int capacity) { mCapacity = capacity; mSize = 0; } public synchronized void produce(int val) { try { int left = val; while (left > 0) { while (mSize >= mCapacity) wait(); int inc = (mSize + left) > mCapacity ? (mCapacity - mSize) : left; mSize += inc; left -= inc; System.out.println("produce Thread: " + Thread.currentThread().getName() + " val: " + val + " mSize: " + mSize + " left: " + left); notifyAll(); } } catch (InterruptedException e) { e.printStackTrace(); } } public synchronized void consume(int val) { try { int left = val; while (left > 0) { while (mSize <= 0) wait(); int inc = (mSize - left) < 0 ? mSize : left; mSize -= inc; left -= inc; System.out.println("consume Thread: " + Thread.currentThread().getName() + " val: " + val + " mSize: " + mSize + " left: " + left); notifyAll(); } } catch (InterruptedException e) { e.printStackTrace(); } } } private static class Producer { private Depot depot; public Producer(Depot depot) { this.depot = depot; } public void produce(int val) { new Thread() { @Override public void run() { depot.produce(val); } }.start(); } } static class Customer { private Depot depot; public Customer(Depot depot) { this.depot = depot; } public void consume(int val) { new Thread() { @Override public void run() { depot.consume(val); } }.start(); } } public static void main(String[] args) { Depot depot = new Depot(100); Producer producer = new Producer(depot); Customer customer = new Customer(depot); producer.produce(60); producer.produce(120); customer.consume(90); customer.consume(150); producer.produce(110); }

ReentrantLock

public static class Depot { private int mCapacity; private int mSize; private Lock mLock; private Condition mFullCondition; private Condition mEmptyCondition; public Depot(int capacity) { mCapacity = capacity; mSize = 0; mLock = new ReentrantLock(); mFullCondition = mLock.newCondition(); mEmptyCondition = mLock.newCondition(); } public void produce(int val) { mLock.lock(); try { int left = val; while (left > 0) { while (mSize >= mCapacity) mFullCondition.await(); int inc = (mSize + left) > mCapacity ? (mCapacity - mSize) : left; mSize += inc; left -= inc; System.out.println("produce Thread: " + Thread.currentThread().getName() + " mSize: " + mSize + " left: " + left); mEmptyCondition.signal(); } } catch (InterruptedException e) { e.printStackTrace(); } finally { mLock.unlock(); } } public void consume(int val) { mLock.lock(); try { int left = val; while (left > 0) { while (mSize <= 0) mEmptyCondition.await(); int inc = (mSize - left) < 0 ? mSize : left; mSize -= inc; left -= inc; System.out.println("consume Thread: " + Thread.currentThread().getName() + " mSize: " + mSize + " left: " + left); mFullCondition.signal(); } } catch (InterruptedException e) { e.printStackTrace(); } finally { mLock.unlock(); } } } static class Producer { private Depot depot; public Producer(Depot depot) { this.depot = depot; } public void produce(int val) { new Thread() { @Override public void run() { depot.produce(val); } }.start(); } } static class Customer { private Depot depot; public Customer(Depot depot) { this.depot = depot; } public void consume(int val) { new Thread() { @Override public void run() { depot.consume(val); } }.start(); } } public static void main(String[] args) { Depot depot = new Depot(100); Producer producer = new Producer(depot); Customer customer = new Customer(depot); producer.produce(60); producer.produce(120); customer.consume(90); customer.consume(150); producer.produce(110); }
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美专区福利在线| 亚洲伊人一本大道中文字幕| 欧美精品久久久久| 日韩在线高清视频| 日韩精品丝袜在线| 欧美午夜视频在线观看| 68精品国产免费久久久久久婷婷| 奇米四色中文综合久久| 成人黄色在线观看| 国产大片精品免费永久看nba| 久久深夜福利免费观看| 亚洲图片在区色| 国产欧美韩国高清| 亚洲综合社区网| 久久精品电影网站| 亚洲激情在线观看| 亚洲成人aaa| 亚洲一区二区久久久久久| 在线性视频日韩欧美| 91av视频在线免费观看| 亚洲精品日产aⅴ| 成人免费在线视频网址| 色妞欧美日韩在线| 日韩欧美高清视频| 国产日韩在线观看av| 国产欧美日韩视频| 国产精品入口夜色视频大尺度| 亚洲性xxxx| 亚洲黄色在线观看| 亚洲三级av在线| 国产精品高潮呻吟久久av无限| 亚洲国产精品成人精品| 国产成人亚洲综合| 日韩电视剧在线观看免费网站| 国产精品天天狠天天看| 97视频在线观看亚洲| 国产伦精品免费视频| 一区二区亚洲欧洲国产日韩| 在线看日韩欧美| 亚洲国产91精品在线观看| 两个人的视频www国产精品| 日韩在线国产精品| 91精品国产高清自在线看超| 亚洲伊人成综合成人网| 国产91精品网站| 午夜精品视频在线| 日韩av不卡在线| 亚洲精品美女免费| 国产不卡精品视男人的天堂| 中文字幕成人在线| 91精品国产综合久久久久久久久| 欧美极品少妇xxxxⅹ喷水| 亚洲自拍另类欧美丝袜| 亚洲精品电影久久久| www.日本久久久久com.| 成人在线视频网| 免费97视频在线精品国自产拍| 国产99久久精品一区二区永久免费| 国产精品色午夜在线观看| 亚洲黄色成人网| 国产成人高清激情视频在线观看| 成人免费激情视频| 欧美国产视频一区二区| 日韩国产在线看| 亚洲va久久久噜噜噜久久天堂| 国产精品自产拍在线观看中文| 成人情趣片在线观看免费| 国产精品永久免费在线| 国产亚洲精品久久久优势| 精品国产欧美成人夜夜嗨| 国产91热爆ts人妖在线| 久久亚洲欧美日韩精品专区| 欧美激情2020午夜免费观看| 激情亚洲一区二区三区四区| 欧美成人剧情片在线观看| 国产精品偷伦一区二区| 久久久国产精彩视频美女艺术照福利| 97视频免费在线观看| 日韩女优人人人人射在线视频| 欧美乱大交xxxxx另类电影| 九九久久久久久久久激情| 久久久精品久久久| 亚洲天堂av图片| 欧美日韩另类在线| 日韩电视剧在线观看免费网站| 国产精品成人品| 97国产suv精品一区二区62| 色噜噜狠狠色综合网图区| 在线观看免费高清视频97| 日韩在线播放视频| 亚洲福利视频久久| 日韩在线免费视频观看| 91美女片黄在线观| 亚洲护士老师的毛茸茸最新章节| 欧美综合国产精品久久丁香| 九九热r在线视频精品| 性色av一区二区三区免费| 日韩欧美亚洲范冰冰与中字| 亚洲精品免费一区二区三区| 91在线观看免费| 日本电影亚洲天堂| 91手机视频在线观看| 国产精品日韩精品| 国产亚洲精品久久久久动| 亚洲欧美在线一区二区| 91精品在线一区| 精品中文字幕在线观看| **欧美日韩vr在线| 97精品国产aⅴ7777| 色诱女教师一区二区三区| 国产亚洲aⅴaaaaaa毛片| 亚洲美女免费精品视频在线观看| 日本高清+成人网在线观看| 欧美在线视频导航| 欧美国产视频一区二区| 久久精品福利视频| 久久久久久国产精品久久| 成人有码在线播放| 欧美激情视频一区| 精品一区二区三区四区| 国产一区二区三区在线免费观看| 草民午夜欧美限制a级福利片| 亚洲人成欧美中文字幕| 亚洲精选一区二区| 亚洲免费视频网站| 福利视频一区二区| 91国产精品电影| 久久精品人人做人人爽| 国产成人精品午夜| 国产精品中文字幕在线观看| 欧美日韩另类视频| 日韩精品极品毛片系列视频| 亚洲2020天天堂在线观看| 精品女同一区二区三区在线播放| 欧美精品videossex88| 91成人在线视频| 国产精品视频一区二区高潮| 成人www视频在线观看| 亚洲精品一区在线观看香蕉| 日韩精品在线视频| 最好看的2019年中文视频| 91国在线精品国内播放| 欧美日本亚洲视频| 尤物yw午夜国产精品视频| 欧美国产精品日韩| 久色乳综合思思在线视频| 国产日韩在线亚洲字幕中文| 亚洲欧美日韩高清| 中文字幕亚洲国产| 亚洲有声小说3d| 日韩在线资源网| 国产日韩欧美日韩| 91在线视频成人| 久久久久久亚洲| 国语自产精品视频在线看| 国产精品免费在线免费| 亚洲japanese制服美女| 欧美国产在线电影| 国产偷亚洲偷欧美偷精品| 久久天天躁狠狠躁夜夜躁2014| 欧美精品久久久久久久久久| 欧美激情精品久久久久久大尺度| 欧美午夜视频一区二区| 亚洲色图第一页|