synchronized的一些记录
生活随笔
收集整理的這篇文章主要介紹了
synchronized的一些记录
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1、方法內的私有變量,不存在線程安全問題。非線程安全問題存在于實例變量(全局變量)中
2、在方法上加synchronized表示,當第一個線程進入時方法加鎖(其他方法無法調用)
3、synchronized取得的鎖是對象鎖,而不是把一段代碼或方法(函數)當作鎖,所以哪個線程先執行帶synchronized關鍵字的方法,哪個線程就持有該方法所屬對象的鎖Lock,那么其他線程只能呈等待狀態,前提是多個線程訪問的是同一個對象。
4.1、A線程先持有Object對象的Lock鎖,B線程可以以異步的方式調用Object對象中的非synchronized類型的方法。
4.2、A線程先持有Object對象的Lock鎖,B線程如果在這時調用Object對象中的synchronized類型的方法則需等待,也就是同步。
5、當使用synchronized時,當一個線程得到一個對象的鎖后,該線程再次請求此對象鎖時是可以再次得到該對象的鎖的。synchronized方法/塊的內部調用本類的其他synchronized方法/塊時,是永遠可以得到鎖的。
6、可重入鎖特性:自己可以再次獲取自己的內部鎖。比如有一個線程獲得了某個對象的鎖,此時這個對象鎖還沒有釋放,當其再次想要獲取這個對象的鎖的時候還是可以獲取的。【synchronized是可重入鎖】
7、出現異常的鎖,會自動釋放該對象鎖。
8、synchronized與static synchronized 的區別:synchronized是對類的當前實例(當前對象)進行加鎖,防止其他線程同時訪問該類的該實例的所有synchronized塊,注意這里是“類的當前實例”, 類的兩個不同實例就沒有這種約束了。【實例對象進行限制】
static synchronized恰好就是要控制類的所有實例的并發訪問,static synchronized是限制多線程中該類的所有實例同時訪問jvm中該類所對應的代碼塊。【類對象進行限制】
pulbic?class?Something(){ ?
? ??public?synchronized?void?isSyncA(){} ?
? ??public?synchronized?void?isSyncB(){} ?
? ??public?static?synchronized?void?cSyncA(){} ?
? ??public?static?synchronized?void?cSyncB(){} ?
} ?
a.?x.isSyncA()與x.isSyncB() ??
b.?x.isSyncA()與y.isSyncA() ?
c.?x.cSyncA()與y.cSyncB() ?
d.?x.isSyncA()與Something.cSyncA() ?
上述各組方法被多線程同時訪問的情況:
a中都是對實例x進行訪問,因此不能同時被訪問,會產生阻塞情況b中訪問的是不同的實例,可以同時訪問c中雖然訪問的不同實例,但是調用的方法是鎖定類對象,所以會產生阻塞d中可以同時被訪問,因為前者使用對象鎖,后者使用的是類鎖,兩者無關
2、在方法上加synchronized表示,當第一個線程進入時方法加鎖(其他方法無法調用)
3、synchronized取得的鎖是對象鎖,而不是把一段代碼或方法(函數)當作鎖,所以哪個線程先執行帶synchronized關鍵字的方法,哪個線程就持有該方法所屬對象的鎖Lock,那么其他線程只能呈等待狀態,前提是多個線程訪問的是同一個對象。
4.1、A線程先持有Object對象的Lock鎖,B線程可以以異步的方式調用Object對象中的非synchronized類型的方法。
4.2、A線程先持有Object對象的Lock鎖,B線程如果在這時調用Object對象中的synchronized類型的方法則需等待,也就是同步。
5、當使用synchronized時,當一個線程得到一個對象的鎖后,該線程再次請求此對象鎖時是可以再次得到該對象的鎖的。synchronized方法/塊的內部調用本類的其他synchronized方法/塊時,是永遠可以得到鎖的。
6、可重入鎖特性:自己可以再次獲取自己的內部鎖。比如有一個線程獲得了某個對象的鎖,此時這個對象鎖還沒有釋放,當其再次想要獲取這個對象的鎖的時候還是可以獲取的。【synchronized是可重入鎖】
7、出現異常的鎖,會自動釋放該對象鎖。
8、synchronized與static synchronized 的區別:synchronized是對類的當前實例(當前對象)進行加鎖,防止其他線程同時訪問該類的該實例的所有synchronized塊,注意這里是“類的當前實例”, 類的兩個不同實例就沒有這種約束了。【實例對象進行限制】
static synchronized恰好就是要控制類的所有實例的并發訪問,static synchronized是限制多線程中該類的所有實例同時訪問jvm中該類所對應的代碼塊。【類對象進行限制】
pulbic?class?Something(){ ?
? ??public?synchronized?void?isSyncA(){} ?
? ??public?synchronized?void?isSyncB(){} ?
? ??public?static?synchronized?void?cSyncA(){} ?
? ??public?static?synchronized?void?cSyncB(){} ?
} ?
a.?x.isSyncA()與x.isSyncB() ??
b.?x.isSyncA()與y.isSyncA() ?
c.?x.cSyncA()與y.cSyncB() ?
d.?x.isSyncA()與Something.cSyncA() ?
上述各組方法被多線程同時訪問的情況:
a中都是對實例x進行訪問,因此不能同時被訪問,會產生阻塞情況b中訪問的是不同的實例,可以同時訪問c中雖然訪問的不同實例,但是調用的方法是鎖定類對象,所以會產生阻塞d中可以同時被訪問,因為前者使用對象鎖,后者使用的是類鎖,兩者無關
轉載于:https://www.cnblogs.com/myna/p/7942053.html
總結
以上是生活随笔為你收集整理的synchronized的一些记录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: dapper使用时性能优化
- 下一篇: net clr via c sharp