91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java synchronized關鍵字和Lock接口實現原理

發布時間:2020-09-07 09:17:02 來源:腳本之家 閱讀:145 作者:布爾bl 欄目:編程語言

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

引用

當開發過程中,我們遇到并發問題。怎么解決?

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

synchronized關鍵字

synchronized也叫同步鎖,是Java里面的關鍵字。我們可以猜測到synchronized原理也JVM虛擬機有關聯。

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

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

  • 當monitor的進入數為0,線程A進入
  • monitor的進入數為1
  • 線程B想進入該monitor就會被阻塞。

線程A可以重復進入該monitor,所以synchronized是可重入鎖,和Lock實現的鎖一樣。

程序驗證

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++;
      }
    }
  }
}

運行結果

程序正常運行,沒有報錯

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();
    }
  }
}

運行結果

100000

如果去掉 synchronized 關鍵字的話,運行結果大概率不是 100000,因為線程不安全問題。

Lock接口

一般我們使用 ReentrantLock 類作為重入鎖,實現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("結果為:"+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();
      }
    }
  }
}

運行結果

結果為:100000

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

Java synchronized關鍵字和Lock接口實現原理

每一個線程都對可以用鑰匙解開這把鎖,對于程序而言,加鎖操作就沒有意義了。因為我們需要的是一個鎖。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

富蕴县| 新宁县| 富阳市| 政和县| 灵宝市| 新化县| 鹿邑县| 大田县| 河北省| 廊坊市| 介休市| 山阴县| 平江县| 东乡族自治县| 察哈| 新密市| 古蔺县| 大连市| 鄄城县| 牟定县| 健康| 巴林右旗| 江永县| 宁远县| 白河县| 通榆县| 韩城市| 通渭县| 张掖市| 阿克苏市| 页游| 泸定县| 称多县| 昌宁县| 中牟县| 南靖县| 清苑县| 无极县| 福海县| 永城市| 西盟|