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