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

Test實例



運行Test實例結果


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

methodAmethodB都是搶占同一個類鎖,這兩線程的運行結果符合預期的同步執行。

末尾

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

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 一:java概述: 1,JDK:Java Development Kit,java的開發和運行環境,java的開發...
    慕容小偉閱讀 1,836評論 0 10
  • 從三月份找實習到現在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發崗...
    時芥藍閱讀 42,360評論 11 349
  • 整理來自互聯網 1,JDK:Java Development Kit,java的開發和運行環境,java的開發工具...
    Ncompass閱讀 1,553評論 0 6
  • 黑夜捻滅了燭光 孤獨扔來一個座 把我拉回它的懷里 思念急了 伸出手來 扯著我的衣袖要去尋你 魂靈悄悄對我說 它剛剛...
    道有所鐘閱讀 173評論 4 5
  • 超能量的咖啡冥想助力每一個人,實現心中的目標。是時候為今天的好種子澆水施肥曬太陽了[太陽] 我近期最想實現的一個目...
    張蓉萍閱讀 123評論 0 0