synchronized 之 對象鎖 和 類鎖

1、synchronized(object)

若是object沒有被加鎖,則獲取object的鎖;若是object已經被加鎖則等待object的鎖被釋放。安全

2、須要加鎖的情景

多線程共享同一資源會引發線程安全的狀況下,才須要加同步鎖。不一樣的對象在不一樣的線程中時(如:A類的A1對象,和A類的A2對象,分別在線程a1和a2中),是不存在線程安全問題的。多線程

3、synchronized的幾種用法或者是形式

大體能夠分爲兩種狀況異步

  1. synchronized修飾非靜態方法、同步代碼塊的synchronized (this)用法和synchronized (非this對象)
  2. synchronized修飾靜態方法以及同步代碼塊的synchronized (類.class)

4、理解 synchronized修飾非靜態方法 和 synchronized(this)

用synchronized修飾方法和用synchronized(this)獲取的是該對象的鎖this

  1. synchronized同步方法
    1. 對其它的synchronized同步方法或synchronized(this)同步代碼塊調用是堵塞狀態;
    2. 同一時間只有一個線程執行synchronized同步方法中的代碼。
  2. synchronized(this)同步代碼塊
    1. 對其它的synchronized同步方法或synchronized(this)同步代碼塊調用是堵塞狀態;
    2. 同一時間只有一個線程執行synchronized同步方法中的代碼。
  3. synchronized(非this對象)同步代碼塊
    1. 好處: 若是在一個類中有不少個synchronized方法,這是雖然能夠實現同步,可是會受到阻塞。影響效率。可是若是使用了同步代碼塊的非this鎖,則該synchronized(非this)代碼塊和程序中的同步方法是異步的。不和其餘線程爭取this鎖,能夠提升運行效率。
    2. 使用synchronized(任意自定義對象)進行同步操做,對象監視器必須是同一個對象。若是不是同一個,運行就是異步執行了。

5、理解synchronized修飾靜態方法 和 synchronized (類.class)

  1. 一個類只有一個類對象,其實類鎖也是類的對象鎖,靜態的方法或代碼塊是屬於類(類對象)的,因此synchronized修飾靜態資源須要獲取類鎖。
  2. 修飾靜態方法 和 修飾靜態方法 內的代碼快 與 (四) 相同
  3. synchronized (類.class)修飾非靜態代碼快,全部類的實例包括類對象自己(類.class)都會被堵塞。

6、參考

https://blog.csdn.net/u013142781/article/details/51697672.net

https://blog.csdn.net/luckey_zh/article/details/53815694線程

https://blog.csdn.net/mrsyf/article/details/78206412對象

相關文章
相關標籤/搜索