1、synchronized(object)
若是object沒有被加鎖,則獲取object的鎖;若是object已經被加鎖則等待object的鎖被釋放。安全
2、須要加鎖的情景
多線程共享同一資源會引發線程安全的狀況下,才須要加同步鎖。不一樣的對象在不一樣的線程中時(如:A類的A1對象,和A類的A2對象,分別在線程a1和a2中),是不存在線程安全問題的。多線程
3、synchronized的幾種用法或者是形式
大體能夠分爲兩種狀況異步
- synchronized修飾非靜態方法、同步代碼塊的synchronized (this)用法和synchronized (非this對象)
- synchronized修飾靜態方法以及同步代碼塊的synchronized (類.class)
4、理解 synchronized修飾非靜態方法 和 synchronized(this)
用synchronized修飾方法和用synchronized(this)獲取的是該對象的鎖this
- synchronized同步方法
- 對其它的synchronized同步方法或synchronized(this)同步代碼塊調用是堵塞狀態;
- 同一時間只有一個線程執行synchronized同步方法中的代碼。
- synchronized(this)同步代碼塊
- 對其它的synchronized同步方法或synchronized(this)同步代碼塊調用是堵塞狀態;
- 同一時間只有一個線程執行synchronized同步方法中的代碼。
- synchronized(非this對象)同步代碼塊
- 好處: 若是在一個類中有不少個synchronized方法,這是雖然能夠實現同步,可是會受到阻塞。影響效率。可是若是使用了同步代碼塊的非this鎖,則該synchronized(非this)代碼塊和程序中的同步方法是異步的。不和其餘線程爭取this鎖,能夠提升運行效率。
- 使用synchronized(任意自定義對象)進行同步操做,對象監視器必須是同一個對象。若是不是同一個,運行就是異步執行了。
5、理解synchronized修飾靜態方法 和 synchronized (類.class)
- 一個類只有一個類對象,其實類鎖也是類的對象鎖,靜態的方法或代碼塊是屬於類(類對象)的,因此synchronized修飾靜態資源須要獲取類鎖。
- 修飾靜態方法 和 修飾靜態方法 內的代碼快 與 (四) 相同
- 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對象