最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java synchronized關(guān)鍵字和Lock接口實(shí)現(xiàn)原理

 更新時(shí)間:2019年12月02日 11:09:31   作者:布爾bl  
這篇文章主要介紹了Java synchronized關(guān)鍵字和Lock接口實(shí)現(xiàn)原理,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

這篇文章主要介紹了Java synchronized關(guān)鍵字和Lock接口實(shí)現(xiàn)原理,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

引用

當(dāng)開發(fā)過程中,我們遇到并發(fā)問題。怎么解決?

一種解決方式,簡單粗暴:上鎖。將千軍萬馬都給攔下來,只允許一個(gè)人過獨(dú)木橋。書面意思就是將并行的程序變成串行的程序?,F(xiàn)實(shí)的鎖有門鎖、掛鎖和抽屜鎖等等。在Java中,我們的鎖就是synchronized關(guān)鍵字和Lock接口。

synchronized關(guān)鍵字

synchronized也叫同步鎖,是Java里面的關(guān)鍵字。我們可以猜測到synchronized原理也JVM虛擬機(jī)有關(guān)聯(lián)。

synchronized鎖的是對象。對象里面有一個(gè)叫做監(jiān)視鎖(monitor)的東西,監(jiān)視鎖依賴操作系統(tǒng)的互斥鎖(Mutex Lock)。操作系統(tǒng)切換線程其實(shí)就是從用戶態(tài)編程核心態(tài)(cpu的兩種狀態(tài))。這個(gè)代價(jià)有點(diǎn)高,所以synchronized這個(gè)重量級鎖后面也引進(jìn)了偏向鎖和輕量級鎖。

加鎖(監(jiān)視鎖monitor)過程分析():

  • 當(dāng)monitor的進(jìn)入數(shù)為0,線程A進(jìn)入
  • monitor的進(jìn)入數(shù)為1
  • 線程B想進(jìn)入該monitor就會(huì)被阻塞。

線程A可以重復(fù)進(jìn)入該monitor,所以synchronized是可重入鎖,和Lock實(shí)現(xiàn)的鎖一樣。

程序驗(yàn)證

public class SynchronizedTest {
  private static int i = 0;
  public static void main(String[] args) {
    test();
  }

  public static void test(){
    synchronized (SynchronizedTest.class){
      synchronized (SynchronizedTest.class){
        i++;
      }
    }
  }
}

運(yùn)行結(jié)果

程序正常運(yùn)行,沒有報(bào)錯(cuò)

synchronized可以修飾方法以及代碼塊,代碼塊就是上面重入鎖的例子。

修飾方法

public class SynchronizedTest {
  static int n = 100;
  final static CountDownLatch start = new CountDownLatch(n);
  private static int i = 0;
  public static void main(String[] args) throws InterruptedException {
    for (int j = 0; j < n; j++) {
      Thread thread = new Thread(new addNoSynchronized());
      thread.start();
    }
    start.await();
    System.out.println(i);
  }

  public static class addSynchronized implements Runnable{
    @Override
    public void run() {
      addSynchronized();
    }
    public static synchronized void addSynchronized(){
      for (int j = 0; j < 1000; j++) {
        i++;
      }
      start.countDown();
    }
  }
}

運(yùn)行結(jié)果

100000

如果去掉 synchronized 關(guān)鍵字的話,運(yùn)行結(jié)果大概率不是 100000,因?yàn)榫€程不安全問題。

Lock接口

一般我們使用 ReentrantLock 類作為重入鎖,實(shí)現(xiàn)Lock接口。

使用方法

public class ReentranLockTest {
  private static int j;
  private static int n = 100;
  private static CountDownLatch latch = new CountDownLatch(n);
  public static void main(String[] args) throws InterruptedException {
    for (int i = 0; i < n; i++) {
      new Thread(new LockTest()).start();
    }
    latch.await();
    System.out.println("結(jié)果為:"+j);
  }

  public static class LockTest implements Runnable{
    static Lock lock = new ReentrantLock();
    @Override
    public void run() {
      lockTest();
      latch.countDown();
    }
    private void lockTest() {
      lock.lock();
      try {
        for (int i = 0; i < 1000; i++) {
            j++;
        }
      }finally {
        lock.unlock();
      }
    }
  }
}

運(yùn)行結(jié)果

結(jié)果為:100000

這里我們鎖住的 j++ 這塊資源區(qū)(公共資源),lock 是 static 關(guān)鍵字修飾的,是類對象,思考一下如果不是類對象會(huì)怎么樣?那就是連環(huán)鎖了(看圖)。

每一個(gè)線程都對可以用鑰匙解開這把鎖,對于程序而言,加鎖操作就沒有意義了。因?yàn)槲覀冃枰氖且粋€(gè)鎖。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java讀寫pdf文件的詳細(xì)實(shí)現(xiàn)方法

    Java讀寫pdf文件的詳細(xì)實(shí)現(xiàn)方法

    最近公司的項(xiàng)目中需要操作pdf文件,所以這里給大家總結(jié)下方法,這篇文章主要給大家介紹了關(guān)于Java讀寫pdf文件的詳細(xì)實(shí)現(xiàn)方法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-09-09
  • SpringBoot集成Aviator實(shí)現(xiàn)參數(shù)校驗(yàn)的代碼工程

    SpringBoot集成Aviator實(shí)現(xiàn)參數(shù)校驗(yàn)的代碼工程

    Aviator是一個(gè)高性能、輕量級的java語言實(shí)現(xiàn)的表達(dá)式求值引擎,主要用于各種表達(dá)式的動(dòng)態(tài)求值,本文給大家詳細(xì)介紹了SpringBoot集成Aviator實(shí)現(xiàn)參數(shù)校驗(yàn)的方法,并通過代碼示例講解的非常詳細(xì),需要的朋友可以參考下
    2024-11-11
  • springboot連接Redis的教程詳解

    springboot連接Redis的教程詳解

    這篇文章主要介紹了springboot連接Redis的教程詳解,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • springBoot前后端分離項(xiàng)目中shiro的302跳轉(zhuǎn)問題

    springBoot前后端分離項(xiàng)目中shiro的302跳轉(zhuǎn)問題

    這篇文章主要介紹了springBoot前后端分離項(xiàng)目中shiro的302跳轉(zhuǎn)問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • SpringMVC實(shí)現(xiàn)文件上傳和下載的工具類

    SpringMVC實(shí)現(xiàn)文件上傳和下載的工具類

    這篇文章主要為大家詳細(xì)介紹了SpringMVC實(shí)現(xiàn)文件上傳和下載的工具類,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • spring cloud gateway網(wǎng)關(guān)路由分配代碼實(shí)例解析

    spring cloud gateway網(wǎng)關(guān)路由分配代碼實(shí)例解析

    這篇文章主要介紹了spring cloud gateway網(wǎng)關(guān)路由分配代碼實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • maven引入第三方j(luò)ar包配置詳解

    maven引入第三方j(luò)ar包配置詳解

    這篇文章主要為大家介紹了maven引入第三方j(luò)ar包配置詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • vscode快速引入第三方j(luò)ar包發(fā)QQ郵件

    vscode快速引入第三方j(luò)ar包發(fā)QQ郵件

    這篇文章主要介紹了vscode快速引入第三方j(luò)ar包發(fā)QQ郵件,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • Mybatis 動(dòng)態(tài)sql的編寫與開啟二級緩存

    Mybatis 動(dòng)態(tài)sql的編寫與開啟二級緩存

    二級緩存是Mapper級別的緩存,多個(gè)SqlSession去操作同一個(gè)Mapper中的SQL語句,則這些SqlSession可以共享二級緩存,即二級緩存是跨SqlSession的,這篇文章主要介紹了Mybatis 動(dòng)態(tài)sql的編寫|開啟二級緩存,需要的朋友可以參考下
    2023-02-02
  • Java實(shí)現(xiàn)單線程聊天室

    Java實(shí)現(xiàn)單線程聊天室

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)單線程聊天室,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-09-09

最新評論

辛集市| 双辽市| 陆丰市| 五大连池市| 四川省| 新宾| 昌邑市| 左贡县| 合作市| 焉耆| 宣化县| 祁连县| 巫溪县| 南通市| 太湖县| 浦江县| 如东县| 固原市| 志丹县| 玛曲县| 大悟县| 昆山市| 新龙县| 文成县| 阜南县| 西青区| 自治县| 新密市| 时尚| 揭东县| 修水县| 莎车县| 五大连池市| 禹城市| 斗六市| 儋州市| 秦皇岛市| 象州县| 北票市| 康乐县| 河间市|