亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

synchronized基本使用以及原理

FullStackDeveloper / 1570人閱讀

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

1. 場(chǎng)景

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

2. 概念

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

鎖機(jī)制有如下兩種特性

互斥性
在同一時(shí)間只允許一個(gè)線程持有某個(gè)對(duì)象鎖,通過(guò)這種特性來(lái)實(shí)現(xiàn)多線程中的協(xié)調(diào)機(jī)制,這樣在同一時(shí)間只有一個(gè)線程對(duì)所需同步的代碼塊(復(fù)合操作)進(jìn)行訪問(wèn)?;コ庑砸卜Q為操作的原子性

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

3. synchronized的用法

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

同步對(duì)象實(shí)例

 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)方法一樣,都是類級(jí)別的鎖,同時(shí)只有一個(gè)線程能訪問(wèn)帶有同步類鎖的方法。

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實(shí)例

與同步塊的用法一致,表示鎖住整個(gè)當(dāng)前對(duì)象實(shí)例,只有獲取到這個(gè)實(shí)例的鎖才能進(jìn)入這個(gè)方法。

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

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

方法鎖:

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

對(duì)象鎖:

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

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/75905.html

相關(guān)文章

  • java篇

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

    honhon 評(píng)論0 收藏0
  • Java 中的 Monitor 機(jī)制

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

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

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

    Vixb 評(píng)論0 收藏0
  • Java面試題

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

    OnlyMyRailgun 評(píng)論0 收藏0
  • BATJ都愛(ài)問(wèn)的多線程面試題

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

    高勝山 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

FullStackDeveloper

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<