synchronized類鎖與物件鎖

柴碼發表於2018-04-22

synchronized類鎖與物件鎖

前言

在平常的開發中我們處理物件及變數的併發訪問(保證資料的執行緒性安全)時都會想到synchronized關鍵字。當然碰到些具體例項還有其他選擇用於保證多執行緒訪問資源的同步性,例如:ReentrantLockReentrantReadWriteLock

synchronized的使用

我們首先來了解下什麼物件鎖,什麼是類鎖?物件鎖是用於物件例項方法,或者一個物件例項上的,類鎖是用於類的靜態方法或者一個類的class物件上的

  • sychronized關鍵字新增到static靜態方法上或synchonized(Class)程式碼塊是給Class類上鎖
  • sychronized關鍵字新增到非static靜態方法上是給物件上鎖

從以上兩點的定義上可能理解起來有些吃力,下邊我們通過幾個demon來驗證下。

public class Service {

    synchronized public static void methodA() {
        try {
            System.out.println("methodA start by " + Thread.currentThread().getName()+" at time " + System.currentTimeMillis());
            Thread.sleep(3000);
            System.out.println("methodA end by " + Thread.currentThread().getName()+" at time " + System.currentTimeMillis());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    synchronized public static void methodB() {
        try {
            System.out.println("methodB start by " + Thread.currentThread().getName() +" at time " + System.currentTimeMillis());
            Thread.sleep(3000);
            System.out.println("methodB end by " + Thread.currentThread().getName()+" at time " + System.currentTimeMillis());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    synchronized public  void methodC() {
        try {
            System.out.println("methodC start by " + Thread.currentThread().getName()+" at time " + System.currentTimeMillis());
            Thread.sleep(3000);
            System.out.println("methodC end by " + Thread.currentThread().getName()+" at time " + System.currentTimeMillis());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
複製程式碼

synchronized類鎖與物件鎖
synchronized類鎖與物件鎖
synchronized類鎖與物件鎖

Test例項

synchronized類鎖與物件鎖
執行Test例項結果
synchronized類鎖與物件鎖

我們來分析下執行結果:methodA methodC 兩執行緒交叉(非同步)執行,故此我們有這樣的一個結論這兩個執行緒分別搶佔的是不同的鎖一個是類鎖(methodA),一個是物件鎖(methodC)。更深層次的說明了類鎖和物件鎖是兩個不一樣的鎖,控制著不同的區域,它們是互不干擾的。同樣,執行緒獲得物件鎖的同時,也可以獲得該類鎖,即同時獲得兩個鎖,這是允許的.

methodAmethodB都是搶佔同一個類鎖,這兩執行緒的執行結果符合預期的同步執行。

末尾

三人行,必有我師。最近都進行多執行緒以及高併發這塊的掃盲,在給大家分享乾貨的同時,才疏學淺還望大家大刀予以斧正。也歡迎關注我的掘金或簡書,名稱為柴碼

相關文章