Java併發之synchronized關鍵字深度解析(一)

前言java

        近期研讀路神之絕世武學,徜徉於浩瀚無垠知識之海洋,偶有攫取吉光片羽,惶恐未領略其精髓即隱入歲月深處,遂急忙記錄一二,順備來日吹cow之談資。本小系列爲併發之親兒子-獨臂狂俠synchronized專場。安全

1、使用場景併發

        synchronized是java中的一個關鍵字,用於給對象加鎖,保證在單機的併發條件下線程安全。原子性和可見性是它保證線程安全的基礎功能。必定要注意它鎖的是對象,並且它是一個排他的非公平可重入鎖。本文先從使用的場景上來展示其做用。性能

一、用在普通方法中優化

經常使用的格式以下所示:this

1 public static void main(String[] args) {
2         Object obj = new Object();
3         synchronized (obj) {
4             System.out.println("進入鎖");
5             // 邏輯略去
6             System.out.println("退出鎖");
7         }
8     }

其中obj就是咱們加鎖的對象,同一個對象,同一刻只能由一個線程加鎖,即同一個對象的多個同步塊,只能順序執行,沒法同時並行執行。spa

 

二、用在普通方法上線程

 以下所示:code

1 public synchronized void  lockMethod () {
2         System.out.println("進入鎖");
3         // 邏輯略去
4         System.out.println("退出鎖");
5     }

用在普通方法上時,無需指定鎖的對象,這種狀況下java默認鎖的是當前的實例對象。效果相似於1中,小括號裏面是this。對象

 

三、用在靜態方法上

 以下所示:

1 public synchronized static void  lockMethod () {
2         System.out.println("進入鎖");
3         // 邏輯略去
4         System.out.println("退出鎖");
5     }

這種狀況下,synchronized鎖的是當前的類對象,此時造成全局鎖,即在同一個JVM中,用到此方法的地方都是挨個執行此方法。

 

2、synchronized鎖的往事

        你們對JUC包中的lock鎖應該都有過了解,它是jdk1.5的時候出現的,剛出來時lock鎖的性能全方位碾壓synchronized鎖。但synchronized做爲Java的嫡系子孫,JVM的開發者們確定要竭盡全力地扶持它,因此在jdk1.6中針對synchronized作了不少的優化,使其性能跟lock鎖相差無幾,親兒子不愧是親兒子。在jdk1.6中,synchronized會分不一樣狀況對代碼的加鎖機制作優化,好比分了三種鎖:偏向鎖、輕量級鎖、自旋鎖、重量級鎖,設置了鎖膨脹策略、鎖清除機制,還作了批量重偏向、偏向鎖批量撤銷等實現方式提升同步塊執行效率。後面我會用兩節對其原理進行介紹。

3、後記

    何之謂獨臂狂俠,蓋因發功之時,僅需單臂一刀(引用一次),無需左手加鎖右手放鎖,而這一刀之功力,即可覆蓋周身八丈,渾然天成,勁氣運轉之時水潑不進,幾近沒法可破。

相關文章
相關標籤/搜索