摘要:的鎖是非公平鎖,默認(rèn)情況下也是非公平鎖,但可以通過帶布爾值的構(gòu)造函數(shù)要求使用公平鎖。有序性,是保證線程內(nèi)串行語義,避免指令重排等。公平性是減少線程饑餓個(gè)別線程長期等待鎖,但始終無法獲取情況發(fā)生的一個(gè)辦法。
目錄介紹
1.Synchronize和ReentrantLock區(qū)別
1.1 相似點(diǎn)
1.2 區(qū)別
1.3 什么是線程安全問題?如何理解
1.4 線程安全需要保證幾個(gè)基本特性
2.Synchronize在編譯時(shí)如何實(shí)現(xiàn)鎖機(jī)制
3.ReentrantLock使用方法
4.ReentrantLock鎖機(jī)制測試案例分析
4.1 代碼案例分析
4.2 什么時(shí)候選擇用ReentrantLock
4.3 公平鎖和非公平鎖有何區(qū)別
5.問答測試題
5.1 ReentrantLock和synchronized使用分析
好消息博客筆記大匯總【16年3月到至今】,包括Java基礎(chǔ)及深入知識點(diǎn),Android技術(shù)博客,Python學(xué)習(xí)筆記等等,還包括平時(shí)開發(fā)中遇到的bug匯總,當(dāng)然也在工作之余收集了大量的面試題,長期更新維護(hù)并且修正,持續(xù)完善……開源的文件是markdown格式的!同時(shí)也開源了生活博客,從12年起,積累共計(jì)47篇[近20萬字],轉(zhuǎn)載請注明出處,謝謝!
鏈接地址:https://github.com/yangchong2...
如果覺得好,可以star一下,謝謝!當(dāng)然也歡迎提出建議,萬事起于忽微,量變引起質(zhì)變!
關(guān)于鎖機(jī)制文章
01.Synchronize深入解析
Synchronize深入解析,sychonized method 和 synchonized代碼塊的效率問題
02.Synchronize和ReentrantLock區(qū)別
Synchronize和ReentrantLock區(qū)別,Synchronize在編譯時(shí)如何實(shí)現(xiàn)鎖機(jī)制,ReentrantLock鎖機(jī)制測試案例分析,公平鎖和非公平鎖有何區(qū)別等等
03.死鎖的發(fā)生,定位與修復(fù)
死鎖的概念和產(chǎn)生死鎖的根本原因是什么?死鎖的預(yù)防策略中資源有序分配策略是什么。死鎖發(fā)生的場景,死鎖的危害,出現(xiàn)死鎖需要滿足條件分析,如何預(yù)防死鎖,如何定位死鎖,以及死鎖修復(fù)方案分析等等
1.Synchronize和ReentrantLock區(qū)別 1.1 相似點(diǎn):這兩種同步方式有很多相似之處,它們都是加鎖方式同步,而且都是阻塞式的同步,也就是說當(dāng)如果一個(gè)線程獲得了對象鎖,進(jìn)入了同步塊,其他訪問該同步塊的線程都必須阻塞在同步塊外面等待,而進(jìn)行線程阻塞和喚醒的代價(jià)是比較高的(操作系統(tǒng)需要在用戶態(tài)與內(nèi)核態(tài)之間來回切換,代價(jià)很高,不過可以通過對鎖優(yōu)化進(jìn)行改善)。
1.2 區(qū)別:這兩種方式最大區(qū)別就是對于Synchronized來說,它是java語言的關(guān)鍵字,是原生語法層面的互斥,需要jvm實(shí)現(xiàn)。而ReentrantLock它是JDK 1.5之后提供的API層面的互斥鎖,需要lock()和unlock()方法配合try/finally語句塊來完成。
synchronized既可以修飾方法,也可以修飾代碼塊。
//synchronized修飾一個(gè)方法時(shí),這個(gè)方法叫同步方法。 public synchronized void test() { //方法體`` } synchronized(Object) { //括號中表示需要鎖的對象. //線程執(zhí)行的時(shí)候會對Object上鎖 }
ReentrantLock使用
private ReentrantLock lock = new ReentrantLock(); public void run() { lock.lock(); try{ for(int i=0;i<5;i++){ System.out.println(Thread.currentThread().getName()+":"+i); } }finally{ lock.unlock(); } }
等待可中斷是指當(dāng)持有鎖的線程長期不釋放鎖的時(shí)候,正在等待的線程可以選擇放棄等待,改為處理其他事情。可等待特性對處理執(zhí)行時(shí)間非常長的同步快很有幫助。
具體來說,假如業(yè)務(wù)代碼中有兩個(gè)線程,Thread1 Thread2。假設(shè) Thread1 獲取了對象object的鎖,Thread2將等待Thread1釋放object的鎖。
使用synchronized。如果Thread1不釋放,Thread2將一直等待,不能被中斷。synchronized也可以說是Java提供的原子性內(nèi)置鎖機(jī)制。內(nèi)部鎖扮演了互斥鎖(mutual exclusion lock ,mutex)的角色,一個(gè)線程引用鎖的時(shí)候,別的線程阻塞等待。
使用ReentrantLock。如果Thread1不釋放,Thread2等待了很長時(shí)間以后,可以中斷等待,轉(zhuǎn)而去做別的事情。
公平鎖是指多個(gè)線程在等待同一個(gè)鎖時(shí),必須按照申請的時(shí)間順序來依次獲得鎖;而非公平鎖則不能保證這一點(diǎn)。非公平鎖在鎖被釋放時(shí),任何一個(gè)等待鎖的線程都有機(jī)會獲得鎖。
synchronized的鎖是非公平鎖,ReentrantLock默認(rèn)情況下也是非公平鎖,但可以通過帶布爾值的構(gòu)造函數(shù)要求使用公平鎖。
ReentrantLock 構(gòu)造器的一個(gè)參數(shù)是boolean值,它允許您選擇想要一個(gè)公平(fair)鎖,還是一個(gè)不公平(unfair)鎖。公平鎖:使線程按照請求鎖的順序依次獲得鎖, 但是有成本;不公平鎖:則允許討價(jià)還價(jià)
那么如何用代碼設(shè)置公平鎖呢?如下所示
ReentrantLock可以同時(shí)綁定多個(gè)Condition對象,只需多次調(diào)用newCondition方法即可。
synchronized中,鎖對象的wait()和notify()或notifyAll()方法可以實(shí)現(xiàn)一個(gè)隱含的條件。但如果要和多于一個(gè)的條件關(guān)聯(lián)的時(shí)候,就不得不額外添加一個(gè)鎖。
1.3 什么是線程安全問題?如何理解如果你的代碼所在的進(jìn)程中有多個(gè)線程在同時(shí)運(yùn)行,而這些線程可能會同時(shí)運(yùn)行這段代碼。如果每次運(yùn)行結(jié)果和單線程運(yùn)行的結(jié)果是一樣的,而且其他的變量的值也和預(yù)期的是一樣的,就是線程安全的,或者說:一個(gè)類或者程序所提供的接口對于線程來說是原子操作或者多個(gè)線程之間的切換不會導(dǎo)致該接口的執(zhí)行結(jié)果存在二義性,也就是說我們不用考慮同步的問題 。
1.4 線程安全需要保證幾個(gè)基本特性1、原子性,簡單說就是相關(guān)操作不會中途被其他線程干擾,一般通過同步機(jī)制實(shí)現(xiàn)。
2、可見性,是一個(gè)線程修改了某個(gè)共享變量,其狀態(tài)能夠立即被其他線程知曉,通常被解釋為將線程本地狀態(tài)反映到主內(nèi)存上,volatile 就是負(fù)責(zé)保證可見性的。
3、有序性,是保證線程內(nèi)串行語義,避免指令重排等。
2.Synchronize在編譯時(shí)如何實(shí)現(xiàn)鎖機(jī)制Synchronized進(jìn)過編譯,會在同步塊的前后分別形成monitorenter和monitorexit這個(gè)兩個(gè)字節(jié)碼指令。在執(zhí)行monitorenter指令時(shí),首先要嘗試獲取對象鎖。如果這個(gè)對象沒被鎖定,或者當(dāng)前線程已經(jīng)擁有了那個(gè)對象鎖,把鎖的計(jì)算器加1,相應(yīng)的,在執(zhí)行monitorexit指令時(shí)會將鎖計(jì)算器就減1,當(dāng)計(jì)算器為0時(shí),鎖就被釋放了。如果獲取對象鎖失敗,那當(dāng)前線程就要阻塞,直到對象鎖被另一個(gè)線程釋放為止。
3.ReentrantLock使用方法
ReentrantLock是java.util.concurrent包下提供的一套互斥鎖,相比Synchronized,ReentrantLock類提供了一些高級功能,主要有以下3項(xiàng):
1.等待可中斷,持有鎖的線程長期不釋放的時(shí)候,正在等待的線程可以選擇放棄等待,這相當(dāng)于Synchronized來說可以避免出現(xiàn)死鎖的情況。
2.公平鎖,多個(gè)線程等待同一個(gè)鎖時(shí),必須按照申請鎖的時(shí)間順序獲得鎖,Synchronized鎖非公平鎖,ReentrantLock默認(rèn)的構(gòu)造函數(shù)是創(chuàng)建的非公平鎖,可以通過參數(shù)true設(shè)為公平鎖,但公平鎖表現(xiàn)的性能不是很好。
3.鎖綁定多個(gè)條件,一個(gè)ReentrantLock對象可以同時(shí)綁定對個(gè)對象。
使用方法代碼如下
private ReentrantLock lock = new ReentrantLock(); public void run() { lock.lock(); try{ for(int i=0;i<5;i++){ System.out.println(Thread.currentThread().getName()+":"+i); } }finally{ lock.unlock(); } }
注意問題:為保證鎖釋放,每一個(gè) lock() 動作,建議都立即對應(yīng)一都立即對應(yīng)一個(gè) try-catch-finally
4.ReentrantLock鎖機(jī)制測試案例分析 4.1 代碼案例分析
代碼如下所示
private void test2() { Runnable t1 = new MyThread(); new Thread(t1,"t1").start(); new Thread(t1,"t2").start(); } class MyThread implements Runnable { private ReentrantLock lock = new ReentrantLock(); public void run() { lock.lock(); try{ for(int i=0;i<5;i++){ System.out.println(Thread.currentThread().getName()+":"+i); } }finally{ lock.unlock(); } } } //打印值如下所示 10-17 17:06:59.222 6531-6846/com.yc.cn.ycbaseadapter I/System.out: t1:0 10-17 17:06:59.222 6531-6846/com.yc.cn.ycbaseadapter I/System.out: t1:1 10-17 17:06:59.222 6531-6846/com.yc.cn.ycbaseadapter I/System.out: t1:2 10-17 17:06:59.222 6531-6846/com.yc.cn.ycbaseadapter I/System.out: t1:3 10-17 17:06:59.222 6531-6846/com.yc.cn.ycbaseadapter I/System.out: t1:4 10-17 17:06:59.224 6531-6847/com.yc.cn.ycbaseadapter I/System.out: t2:0 10-17 17:06:59.225 6531-6847/com.yc.cn.ycbaseadapter I/System.out: t2:1 10-17 17:06:59.225 6531-6847/com.yc.cn.ycbaseadapter I/System.out: t2:2 10-17 17:06:59.225 6531-6847/com.yc.cn.ycbaseadapter I/System.out: t2:3 10-17 17:06:59.225 6531-6847/com.yc.cn.ycbaseadapter I/System.out: t2:44.2 什么時(shí)候選擇用ReentrantLock
適用場景:時(shí)間鎖等候、可中斷鎖等候、無塊結(jié)構(gòu)鎖、多個(gè)條件變量或者鎖投票
在確實(shí)需要一些 synchronized所沒有的特性的時(shí)候,比如時(shí)間鎖等候、可中斷鎖等候、無塊結(jié)構(gòu)鎖、多個(gè)條件變量或者鎖投票。 ReentrantLock 還具有可伸縮性的好處,應(yīng)當(dāng)在高度爭用的情況下使用它,但是請記住,大多數(shù) synchronized 塊幾乎從來沒有出現(xiàn)過爭用,所以可以把高度爭用放在一邊。我建議用 synchronized 開發(fā),直到確實(shí)證明 synchronized 不合適,而不要僅僅是假設(shè)如果使用 ReentrantLock “性能會更好”。請記住,這些是供高級用戶使用的高級工具。(而且,真正的高級用戶喜歡選擇能夠找到的最簡單工具,直到他們認(rèn)為簡單的工具不適用為止。)。一如既往,首先要把事情做好,然后再考慮是不是有必要做得更快。
使用場景代碼展示【摘自ThreadPoolExecutor類,這個(gè)類中很多地方用到了這個(gè)鎖。自己可以查看】:
/** * Rolls back the worker thread creation. * - removes worker from workers, if present * - decrements worker count * - rechecks for termination, in case the existence of this
*/ private void addWorkerFailed(Worker w) { final ReentrantLock mainLock = this.mainLock; mainLock.lock(); try { if (w != null) workers.remove(w); decrementWorkerCount(); tryTerminate(); } finally { mainLock.unlock(); } } ```4.3 公平鎖和非公平鎖有何區(qū)別
公平性是指在競爭場景中,當(dāng)公平性為真時(shí),會傾向于將鎖賦予等待時(shí)間最久的線程。公平性是減少線程“饑餓”(個(gè)別線程長期等待鎖,但始終無法獲取)情況發(fā)生的一個(gè)辦法。
1、公平鎖能保證:老的線程排隊(duì)使用鎖,新線程仍然排隊(duì)使用鎖。
2、非公平鎖保證:老的線程排隊(duì)使用鎖;但是無法保證新線程搶占已經(jīng)在排隊(duì)的線程的鎖。
看下面代碼案例所示:可以得出結(jié)論,公平鎖指的是哪個(gè)線程先運(yùn)行,那就可以先得到鎖。非公平鎖是不管線程是否是先運(yùn)行,新的線程都有可能搶占已經(jīng)在排隊(duì)的線程的鎖。
private void test3() { Service service = new Service(); ThreadClass tcArray[] = new ThreadClass[10]; for(int i=0;i<10;i++){ tcArray[i] = new ThreadClass(service); tcArray[i].start(); } } public class Service { ReentrantLock lock = new ReentrantLock(true); Service() { } void getThreadName() { System.out.println(Thread.currentThread().getName() + " 已經(jīng)被鎖定"); } } public class ThreadClass extends Thread{ private Service service; ThreadClass(Service service) { this.service = service; } public void run(){ System.out.println(Thread.currentThread().getName() + " 搶到了鎖"); service.lock.lock(); service.getThreadName(); service.lock.unlock(); } } //當(dāng)ReentrantLock設(shè)置true,也就是公平鎖時(shí) 10-17 19:32:22.422 6459-6523/com.yc.cn.ycbaseadapter I/System.out: Thread-5 搶到了鎖 10-17 19:32:22.422 6459-6523/com.yc.cn.ycbaseadapter I/System.out: Thread-5 已經(jīng)被鎖定 10-17 19:32:22.424 6459-6524/com.yc.cn.ycbaseadapter I/System.out: Thread-6 搶到了鎖 10-17 19:32:22.424 6459-6524/com.yc.cn.ycbaseadapter I/System.out: Thread-6 已經(jīng)被鎖定 10-17 19:32:22.427 6459-6525/com.yc.cn.ycbaseadapter I/System.out: Thread-7 搶到了鎖 10-17 19:32:22.427 6459-6526/com.yc.cn.ycbaseadapter I/System.out: Thread-8 搶到了鎖 10-17 19:32:22.427 6459-6525/com.yc.cn.ycbaseadapter I/System.out: Thread-7 已經(jīng)被鎖定 10-17 19:32:22.427 6459-6526/com.yc.cn.ycbaseadapter I/System.out: Thread-8 已經(jīng)被鎖定 10-17 19:32:22.427 6459-6527/com.yc.cn.ycbaseadapter I/System.out: Thread-9 搶到了鎖 10-17 19:32:22.427 6459-6527/com.yc.cn.ycbaseadapter I/System.out: Thread-9 已經(jīng)被鎖定 10-17 19:32:22.428 6459-6528/com.yc.cn.ycbaseadapter I/System.out: Thread-10 搶到了鎖 10-17 19:32:22.428 6459-6528/com.yc.cn.ycbaseadapter I/System.out: Thread-10 已經(jīng)被鎖定 10-17 19:32:22.429 6459-6529/com.yc.cn.ycbaseadapter I/System.out: Thread-11 搶到了鎖 10-17 19:32:22.429 6459-6529/com.yc.cn.ycbaseadapter I/System.out: Thread-11 已經(jīng)被鎖定 10-17 19:32:22.430 6459-6530/com.yc.cn.ycbaseadapter I/System.out: Thread-12 搶到了鎖 10-17 19:32:22.430 6459-6530/com.yc.cn.ycbaseadapter I/System.out: Thread-12 已經(jīng)被鎖定 10-17 19:32:22.431 6459-6532/com.yc.cn.ycbaseadapter I/System.out: Thread-14 搶到了鎖 10-17 19:32:22.431 6459-6532/com.yc.cn.ycbaseadapter I/System.out: Thread-14 已經(jīng)被鎖定 10-17 19:32:22.432 6459-6531/com.yc.cn.ycbaseadapter I/System.out: Thread-13 搶到了鎖 10-17 19:32:22.433 6459-6531/com.yc.cn.ycbaseadapter I/System.out: Thread-13 已經(jīng)被鎖定 //當(dāng)ReentrantLock設(shè)置false,也就是非公平鎖時(shí) 10-17 19:34:58.102 7089-7183/com.yc.cn.ycbaseadapter I/System.out: Thread-5 搶到了鎖 10-17 19:34:58.102 7089-7184/com.yc.cn.ycbaseadapter I/System.out: Thread-6 搶到了鎖 10-17 19:34:58.103 7089-7183/com.yc.cn.ycbaseadapter I/System.out: Thread-5 已經(jīng)被鎖定 10-17 19:34:58.103 7089-7185/com.yc.cn.ycbaseadapter I/System.out: Thread-7 搶到了鎖 10-17 19:34:58.103 7089-7185/com.yc.cn.ycbaseadapter I/System.out: Thread-7 已經(jīng)被鎖定 10-17 19:34:58.103 7089-7184/com.yc.cn.ycbaseadapter I/System.out: Thread-6 已經(jīng)被鎖定 10-17 19:34:58.104 7089-7186/com.yc.cn.ycbaseadapter I/System.out: Thread-8 搶到了鎖 10-17 19:34:58.105 7089-7186/com.yc.cn.ycbaseadapter I/System.out: Thread-8 已經(jīng)被鎖定 10-17 19:34:58.108 7089-7187/com.yc.cn.ycbaseadapter I/System.out: Thread-9 搶到了鎖 10-17 19:34:58.108 7089-7187/com.yc.cn.ycbaseadapter I/System.out: Thread-9 已經(jīng)被鎖定 10-17 19:34:58.111 7089-7188/com.yc.cn.ycbaseadapter I/System.out: Thread-10 搶到了鎖 10-17 19:34:58.112 7089-7188/com.yc.cn.ycbaseadapter I/System.out: Thread-10 已經(jīng)被鎖定 10-17 19:34:58.112 7089-7189/com.yc.cn.ycbaseadapter I/System.out: Thread-11 搶到了鎖 10-17 19:34:58.113 7089-7189/com.yc.cn.ycbaseadapter I/System.out: Thread-11 已經(jīng)被鎖定 10-17 19:34:58.113 7089-7193/com.yc.cn.ycbaseadapter I/System.out: Thread-14 搶到了鎖 10-17 19:34:58.113 7089-7193/com.yc.cn.ycbaseadapter I/System.out: Thread-14 已經(jīng)被鎖定 10-17 19:34:58.115 7089-7190/com.yc.cn.ycbaseadapter I/System.out: Thread-12 搶到了鎖 10-17 19:34:58.115 7089-7190/com.yc.cn.ycbaseadapter I/System.out: Thread-12 已經(jīng)被鎖定 10-17 19:34:58.116 7089-7191/com.yc.cn.ycbaseadapter I/System.out: Thread-13 搶到了鎖 10-17 19:34:58.116 7089-7191/com.yc.cn.ycbaseadapter I/System.out: Thread-13 已經(jīng)被鎖定5.問答測試題 5.1 ReentrantLock和synchronized使用分析
ReentrantLock是Lock的實(shí)現(xiàn)類,是一個(gè)互斥的同步器,在多線程高競爭條件下,ReentrantLock比synchronized有更加優(yōu)異的性能表現(xiàn)。
1 用法比較
Lock使用起來比較靈活,但是必須有釋放鎖的配合動作
Lock必須手動獲取與釋放鎖,而synchronized不需要手動釋放和開啟鎖
Lock只適用于代碼塊鎖,而synchronized可用于修飾方法、代碼塊等
2 特性比較
ReentrantLock的優(yōu)勢體現(xiàn)在:
具備嘗試非阻塞地獲取鎖的特性:當(dāng)前線程嘗試獲取鎖,如果這一時(shí)刻鎖沒有被其他線程獲取到,則成功獲取并持有鎖
能被中斷地獲取鎖的特性:與synchronized不同,獲取到鎖的線程能夠響應(yīng)中斷,當(dāng)獲取到鎖的線程被中斷時(shí),中斷異常將會被拋出,同時(shí)鎖會被釋放
超時(shí)獲取鎖的特性:在指定的時(shí)間范圍內(nèi)獲取鎖;如果截止時(shí)間到了仍然無法獲取鎖,則返回
3 注意事項(xiàng)
在使用ReentrantLock類的時(shí),一定要注意三點(diǎn):
在finally中釋放鎖,目的是保證在獲取鎖之后,最終能夠被釋放
不要將獲取鎖的過程寫在try塊內(nèi),因?yàn)槿绻讷@取鎖時(shí)發(fā)生了異常,異常拋出的同時(shí),也會導(dǎo)致鎖無故被釋放。
ReentrantLock提供了一個(gè)newCondition的方法,以便用戶在同一鎖的情況下可以根據(jù)不同的情況執(zhí)行等待或喚醒的動作。
關(guān)于其他內(nèi)容介紹 01.關(guān)于博客匯總鏈接1.技術(shù)博客匯總
2.開源項(xiàng)目匯總
3.生活博客匯總
4.喜馬拉雅音頻匯總
5.其他匯總
02.關(guān)于我的博客我的個(gè)人站點(diǎn):www.yczbj.org,www.ycbjie.cn
github:https://github.com/yangchong211
知乎:https://www.zhihu.com/people/...
簡書:http://www.jianshu.com/u/b7b2...
csdn:http://my.csdn.net/m0_37700275
喜馬拉雅聽書:http://www.ximalaya.com/zhubo...
開源中國:https://my.oschina.net/zbj161...
泡在網(wǎng)上的日子:http://www.jcodecraeer.com/me...
郵箱:yangchong211@163.com
阿里云博客:https://yq.aliyun.com/users/a... 239.headeruserinfo.3.dT4bcV
segmentfault頭條:https://segmentfault.com/u/xi...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/71744.html
摘要:使當(dāng)前線程休眠,不可調(diào)度。這三種情況下會恢復(fù)其它線程調(diào)用了,當(dāng)前線程恰好被選中了恢復(fù)執(zhí)行其它線程調(diào)用了假醒。 考慮一個(gè)場景,輪流打印0-100以內(nèi)的技術(shù)和偶數(shù)。通過使用 synchronize 的 wait,notify機(jī)制就可以實(shí)現(xiàn),核心思路如下: 使用兩個(gè)線程,一個(gè)打印奇數(shù),一個(gè)打印偶數(shù)。這兩個(gè)線程會共享一個(gè)數(shù)據(jù),數(shù)據(jù)每次自增,當(dāng)打印奇數(shù)的線程發(fā)現(xiàn)當(dāng)前要打印的數(shù)字不是奇數(shù)時(shí),執(zhí)行...
摘要:備注整理一些同步技術(shù),方便日后回顧。單機(jī)多線程情況解讀層面的同步技術(shù),字節(jié)碼實(shí)現(xiàn)。能夠響應(yīng)中斷,讓等待狀態(tài)的線程停止等待。每個(gè)子線程執(zhí)行完畢以后,執(zhí)行函數(shù),字段減,直到字段變?yōu)椤? 備注:整理一些同步技術(shù),方便日后回顧。目前技術(shù)還在學(xué)習(xí)中,了解到同步方面的新知識會補(bǔ)充到本文。 單機(jī)多線程情況: synchronized 1、解讀: (1)jvm層面的同步技術(shù),字節(jié)碼實(shí)現(xiàn)。當(dāng)...
摘要:備注整理一些同步技術(shù),方便日后回顧。單機(jī)多線程情況解讀層面的同步技術(shù),字節(jié)碼實(shí)現(xiàn)。能夠響應(yīng)中斷,讓等待狀態(tài)的線程停止等待。每個(gè)子線程執(zhí)行完畢以后,執(zhí)行函數(shù),字段減,直到字段變?yōu)椤? 備注:整理一些同步技術(shù),方便日后回顧。目前技術(shù)還在學(xué)習(xí)中,了解到同步方面的新知識會補(bǔ)充到本文。 單機(jī)多線程情況: synchronized 1、解讀: (1)jvm層面的同步技術(shù),字節(jié)碼實(shí)現(xiàn)。當(dāng)...
摘要:介紹中無鎖的線程安全整數(shù),一個(gè)提供原子操作的的類。在語言中,和操作并不是線程安全的,在使用的時(shí)候,不可避免的會用到關(guān)鍵字。而則通過一種線程安全的加減操作接口。就是的意思,比較并操作。有個(gè)操作數(shù),內(nèi)存值,舊的預(yù)期值,要修改的新值。 【介紹 JAVA 中無鎖的線程安全整數(shù) AtomicInteger,一個(gè)提供原子操作的Integer的類。在Java語言中,++i和i++操作并不是線程安全的...
摘要:它倆是不沖突的,也就是說獲取了類鎖的線程和獲取了對象鎖的線程是不沖突的可重入鎖住了鎖住了當(dāng)線程進(jìn)入到的方法時(shí),此時(shí)拿到了實(shí)例對象的鎖。當(dāng)一個(gè)線程執(zhí)行的代碼出現(xiàn)異常時(shí),其所持有的鎖會自動釋放。 Java鎖機(jī)制 synchronized鎖 synchronized 簡介 synchronized是Java的一個(gè)關(guān)鍵字,它能夠?qū)⒋a塊(方法)鎖起來 synchronized是一種互...
閱讀 2493·2021-11-15 18:14
閱讀 1718·2021-10-14 09:42
閱讀 3751·2021-10-11 10:58
閱讀 3953·2021-10-09 09:44
閱讀 2418·2021-09-26 09:55
閱讀 2438·2021-09-24 10:38
閱讀 2029·2021-09-04 16:48
閱讀 3273·2021-09-02 15:21