成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

synchronized基本使用以及原理

FullStackDeveloper / 1520人閱讀

摘要:場景在并發(fā)編程中存在線程安全問題,主要原因有存在共享數(shù)據(jù),多線程共同操作共享數(shù)據(jù)。底層語義原理可通過工具和去觀察的底層以及線程情況。注同一個線程可以對同一個對象多次加鎖,,,重入鎖

1. 場景

??????在并發(fā)編程中存在線程安全問題,主要原因有:存在共享數(shù)據(jù),多線程共同操作共享數(shù)據(jù)。關(guān)鍵字synchronized可以保證在同一時刻,只有一個線程可以執(zhí)行某個方法或某個代碼塊,同時synchronized可以保證一個線程的可見性

2. 概念

利用鎖的機制來實現(xiàn)同步的(解決數(shù)據(jù)點不一致性 JMM)

鎖機制有如下兩種特性

互斥性
在同一時間只允許一個線程持有某個對象鎖,通過這種特性來實現(xiàn)多線程中的協(xié)調(diào)機制,這樣在同一時間只有一個線程對所需同步的代碼塊(復(fù)合操作)進行訪問。互斥性也稱為操作的原子性

可見性
必須確保在鎖被釋放之前,對共享變量所做的修改,對于隨后獲得該鎖的另一個線程是可見的(即在獲得鎖時應(yīng)獲得最新共享變量的值),否則另一個線程可能是在本地緩存的某個副本上繼續(xù)操作從而引起不一致。

3. synchronized的用法

同步方法(分普通方法和靜態(tài)方法)
用法:只需要在方法上面添加synchronized關(guān)鍵字即可。
同步普通方法:只能作用在單例上面,如果不是單例,同步方法鎖將失效。
同步靜態(tài)方法:不管你有多少個類實例,同時只有一個線程能獲取鎖進入這個方法。

同步對象實例

 private static int m = 0;
 private Object obj = new Object();

 public void test1() {
     try {
         synchronized (obj) {
             TimeUnit.MINUTES.sleep(2);
             m++;
         }
     } catch (InterruptedException e) {
         e.printStackTrace();
     }
 }

同步類

鎖效果與同步靜態(tài)方法一樣,都是類級別的鎖,同時只有一個線程能訪問帶有同步類鎖的方法。

public class synchronizedDemo {
    private static int m = 0;
    public void test2() {
        try {
            synchronized (synchronizedDemo.class) {
                TimeUnit.MINUTES.sleep(2);
                m++;
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

同步this實例

與同步塊的用法一致,表示鎖住整個當前對象實例,只有獲取到這個實例的鎖才能進入這個方法。

private static int m = 0;
    public void test2() {
        try {
            synchronized (this) {
                TimeUnit.MINUTES.sleep(2);
                m++;
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
4. synchronized底層語義原理

可通過工具jconsole和jstack去觀察synchronized的底層以及線程情況。

方法鎖:

方法鎖就是由關(guān)鍵字ACC_SYNCHRONIZED實現(xiàn)是否互斥方法,

對象鎖:

monitor:在jvm規(guī)范中每個對象和類在邏輯上都是和一個監(jiān)視器(monitor)相關(guān)聯(lián)的,為了實現(xiàn)監(jiān)視器的排他性監(jiān)視能力,JVM為每一個對象和類都關(guān)聯(lián)一個鎖,鎖住了一個對象,這就是獲得對象相關(guān)聯(lián)的監(jiān)視器。
實現(xiàn)原理:某一個線程占有這個對象的時候,首先monitor的計數(shù)器是不是0,如果是0表示還沒有線程占有這個時候線程占有這個對象,并且對這個對象的monitor+1;如果不為0表示這個對象已經(jīng)被其他線程占有,這個線程等待。當線程釋放占有權(quán)的時候monitor-1。
注:同一個線程可以對同一個對象多次加鎖,+1,+1,重入鎖

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/75905.html

相關(guān)文章

  • java篇

    摘要:多線程編程這篇文章分析了多線程的優(yōu)缺點,如何創(chuàng)建多線程,分享了線程安全和線程通信線程池等等一些知識。 中間件技術(shù)入門教程 中間件技術(shù)入門教程,本博客介紹了 ESB、MQ、JMS 的一些知識... SpringBoot 多數(shù)據(jù)源 SpringBoot 使用主從數(shù)據(jù)源 簡易的后臺管理權(quán)限設(shè)計 從零開始搭建自己權(quán)限管理框架 Docker 多步構(gòu)建更小的 Java 鏡像 Docker Jav...

    honhon 評論0 收藏0
  • Java 中的 Monitor 機制

    摘要:基本元素機制需要幾個元素來配合,分別是臨界區(qū)對象及鎖條件變量以及定義在對象上的,操作。這個外部條件在機制中稱為條件變量。提供的機制,其實是,等元素合作形成的,甚至說外部的條件變量也是個組成部分。 monitor的概念 管程,英文是 Monitor,也常被翻譯為監(jiān)視器,monitor 不管是翻譯為管程還是監(jiān)視器,都是比較晦澀的,通過翻譯后的中文,并無法對 monitor 達到一個直觀的描...

    Jacendfeng 評論0 收藏0
  • Synchronized 關(guān)鍵字使用、底層原理、JDK1.6 之后的底層優(yōu)化以及 和ReenTran

    摘要:使用可以禁止的指令重排,保證在多線程環(huán)境下也能正常運行。關(guān)鍵字底層原理總結(jié)關(guān)鍵字底層原理屬于層面。另外在中引入了自適應(yīng)的自旋鎖。自適應(yīng)的自旋鎖帶來的改進就是自旋的時間不在固定了,而是和前一次同一個鎖上的自旋時間以及鎖的擁有者 【強烈推薦!非廣告!】阿里云雙11褥羊毛活動:https://m.aliyun.com/act/team1111/#/share?params=N.FF7yxCc...

    Vixb 評論0 收藏0
  • Java面試題

    摘要:近段時間在準備實習的面試,在網(wǎng)上看到一份面試題,就慢慢試著做,爭取每天積累一點點?,F(xiàn)在每天給自己在面試題編寫的任務(wù)是題,有時候忙起來可能就沒有時間寫了,但是爭取日更,即使當天沒更也會在之后的更新補上。 ????近段時間在準備實習的面試,在網(wǎng)上看到一份面試題,就慢慢試著做,爭取每天積累一點點。????暫時手頭上的面試題只有一份,題量還是挺大的,有208題,所以可能講的不是很詳細,只是我自...

    OnlyMyRailgun 評論0 收藏0
  • BATJ都愛問的多線程面試題

    摘要:今天給大家總結(jié)一下,面試中出鏡率很高的幾個多線程面試題,希望對大家學習和面試都能有所幫助。指令重排在單線程環(huán)境下不會出先問題,但是在多線程環(huán)境下會導(dǎo)致一個線程獲得還沒有初始化的實例。使用可以禁止的指令重排,保證在多線程環(huán)境下也能正常運行。 下面最近發(fā)的一些并發(fā)編程的文章匯總,通過閱讀這些文章大家再看大廠面試中的并發(fā)編程問題就沒有那么頭疼了。今天給大家總結(jié)一下,面試中出鏡率很高的幾個多線...

    高勝山 評論0 收藏0

發(fā)表評論

0條評論

FullStackDeveloper

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<