-
1.效率問(wèn)題 2.看業(yè)務(wù),優(yōu)先考慮synchronized(簡(jiǎn)單) 3.主要判斷被鎖的對(duì)象
查看全部 -
直到等于0時(shí),那個(gè)鎖才算是徹底釋放了
查看全部 -
Synchronized編譯后,會(huì)生成monitorenter-加鎖,monitorexit釋放鎖
查看全部 -
答案:1.先后 2.同時(shí) 3.先后 4.同時(shí) 5.先后 6.同時(shí) 7.會(huì)
查看全部 -
本課程的知識(shí)點(diǎn)回顧
查看全部 -
1、讀寫鎖:讀的時(shí)候可以多線程執(zhí)行
2、將synchronized替換為lock
查看全部 -
synchronized的缺陷:效率低、不夠靈活、不知道是否成功獲取了鎖
查看全部 -
第一次進(jìn)入函數(shù)前拿到鎖1,遞歸進(jìn)入函數(shù)時(shí),synchronized的可重入性,決定了鎖1依舊可以進(jìn)入
查看全部 -
4、同步方法會(huì)有鎖,只有一個(gè)線程進(jìn)入,但是非同步方法隨意進(jìn)入,所以會(huì)出現(xiàn)并發(fā)情況
5、由于兩個(gè)同步方法拿到的是同一個(gè)鎖instance,所以要按照順序執(zhí)行
6、靜態(tài)方法拿到的是類鎖xxx.Class,非靜態(tài)方法拿到的是對(duì)象鎖instance,所以會(huì)出現(xiàn)并發(fā)的情況
7、一定是先拋出異常,再釋放鎖
查看全部 -
1、兩個(gè)thread,一個(gè)instance==按照順序執(zhí)行,加鎖成功
2、兩個(gè)thread,兩個(gè)instance==各自持有鎖,并發(fā)執(zhí)行
3、兩個(gè)thread,一個(gè)synchronized修飾的靜態(tài)方法==此時(shí)是一個(gè)類鎖,即一把鎖,按照順序執(zhí)行
查看全部 -
對(duì)象鎖(方發(fā)鎖、同步代碼塊鎖)、類鎖(靜態(tài)方法鎖、指定鎖為Class對(duì)象)
查看全部 -
synchronized的作用:
能夠保證在“同一時(shí)刻”最多只有一個(gè)線程執(zhí)行該段代碼,達(dá)到保證并發(fā)安全的效果
查看全部 -
synchronized的兩個(gè)用法
查看全部 -
Synchronized的作用:
官方:同步方法支持一種簡(jiǎn)單的策略來(lái)防止線程干擾和內(nèi)存一致性錯(cuò)誤:如果一個(gè)對(duì)象對(duì)多個(gè)線程可見,則對(duì)該對(duì)象變量的所有讀取或?qū)懭攵际峭ㄟ^(guò)同步方法完成的。
一句話說(shuō)出作用:能夠保證在同一時(shí)刻最多只有一個(gè)線程執(zhí)行該段代碼,以達(dá)到保證并發(fā)安全的效果。
Synchronized的兩個(gè)用法:
對(duì)象鎖:
包括方法鎖(默認(rèn)鎖對(duì)象為this當(dāng)前實(shí)例對(duì)象)和同步代碼塊鎖(自己指定鎖對(duì)象)
類鎖:
指synchronized修飾靜態(tài)的方法或指定鎖為Class對(duì)象
性質(zhì)
可重入
什么是可重入:指的是同一線程的外層函數(shù)獲得鎖之后,內(nèi)層函數(shù)可以直接再次獲取該鎖
好處:避免死鎖、提升封裝性
不可中斷
一旦這個(gè)鎖已經(jīng)被別人獲得了,如果我還想獲得,我只能選擇等待或者阻塞,直到別的線程釋放這個(gè)鎖。如果別人永遠(yuǎn)不釋放鎖,那么我只能永遠(yuǎn)地等下去。
原理
加鎖和釋放鎖地原理:
獲取和釋放鎖地時(shí)機(jī):進(jìn)入和推出同步代碼塊(包括拋出異常)
通過(guò)monitorenter和monitorexit指令
可重入原理:加鎖次數(shù)計(jì)數(shù)器
JVM會(huì)記錄被加鎖的次數(shù)
保證可見性地原理:內(nèi)存模型
synchronized可以保證可見性
Synchronized缺陷
效率低:鎖的釋放情況少、視圖獲得鎖時(shí)不能設(shè)定超時(shí)、不能中斷一個(gè)正在試圖獲得鎖的線程
不夠靈活(讀寫鎖更靈活):加鎖和釋放的時(shí)機(jī)單一,每個(gè)鎖僅有單一的條件(某個(gè)對(duì)象),可能是不夠的
無(wú)法知道是否成功獲取到鎖
常見面試問(wèn)題
使用注意點(diǎn):鎖的范圍不宜過(guò)大、避免鎖的嵌套
如何選擇Lock和synchronized關(guān)鍵字?
synchronized能滿足需求優(yōu)先使用synchronized
lock更靈活,但是容易編寫代碼出錯(cuò)
多線程訪問(wèn)同步方法的各種具體情況
確定鎖對(duì)象
思考題
Synchronized使得同時(shí)只有一個(gè)線程可以執(zhí)行,性能較差,有什么辦法可以提升性能?
如果是讀多寫少的情況下,可以使用讀寫鎖代替
我想更靈活地控制鎖地獲取和釋放(現(xiàn)在釋放鎖的時(shí)機(jī)都被規(guī)定死了),怎么辦?、
可以考慮使用Lock
?? ?
總結(jié):
一句話介紹Synchronized:
JVM會(huì)自動(dòng)通過(guò)使用monitor來(lái)加鎖和解鎖,保證了同時(shí)只有一個(gè)線程可以執(zhí)行指定代碼,從而保證了線程安全,同時(shí)具有可重入和不可中斷的性質(zhì)。
查看全部 -
重點(diǎn)看是否需要釋放鎖后再次獲取
查看全部
舉報(bào)