Java對象鎖和類鎖全面解析(多線程synchronized關鍵字)

本文主要是將synchronized關鍵字用法作為例子來去解釋Java中的對象鎖和類鎖炒辉。特別的是希望能幫大家理清一些概念豪墅。

一、synchronized關鍵字

synchronized關鍵字有如下兩種用法:

1黔寇、 在需要同步的方法的方法簽名中加入synchronized關鍵字偶器。

synchronized public void getValue() {
    System.out.println("getValue method thread name="
            + Thread.currentThread().getName() + " username=" + username
            + " password=" + password);
}12345

上面的代碼修飾的synchronized是非靜態(tài)方法,如果修飾的是靜態(tài)方法(static)含義是完全不一樣的缝裤。具體不一樣在哪里屏轰,后面會詳細說清楚。

synchronized static public void getValue() {
    System.out.println("getValue method thread name="
            + Thread.currentThread().getName() + " username=" + username
            + " password=" + password);
}12345

2憋飞、使用synchronized塊對需要進行同步的代碼段進行同步霎苗。

public void serviceMethod() {
    try {
        synchronized (this) {
            System.out.println("begin time=" + System.currentTimeMillis());
            Thread.sleep(2000);
            System.out.println("end    end=" + System.currentTimeMillis());
        }
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

上面的代碼塊是synchronized (this)用法,還有synchronized (非this對象)以及synchronized (類.class)這兩種用法榛做,這些使用方式的含義也是有根本的區(qū)別的唁盏。我們先帶著這些問題繼續(xù)往下看。

4检眯、synchronized (非this對象)

我們先看看代碼實例(Run.java)

public class Run {

    public static void main(String[] args) {

        Service service = new Service("xiaobaoge");

        ThreadA a = new ThreadA(service);
        a.setName("A");
        a.start();

        ThreadB b = new ThreadB(service);
        b.setName("B");
        b.start();

    }

}

class Service {

    String anyString = new String();

    public Service(String anyString){
        this.anyString = anyString;
    }

    public void setUsernamePassword(String username, String password) {
        try {
            synchronized (anyString) {
                System.out.println("線程名稱為:" + Thread.currentThread().getName()
                        + "在" + System.currentTimeMillis() + "進入同步塊");
                Thread.sleep(3000);
                System.out.println("線程名稱為:" + Thread.currentThread().getName()
                        + "在" + System.currentTimeMillis() + "離開同步塊");
            }
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

class ThreadA extends Thread {
    private Service service;

    public ThreadA(Service service) {
        super();
        this.service = service;
    }

    @Override
    public void run() {
        service.setUsernamePassword("a", "aa");

    }

}


class ThreadB extends Thread {

    private Service service;

    public ThreadB(Service service) {
        super();
        this.service = service;
    }

    @Override
    public void run() {
        service.setUsernamePassword("b", "bb");

    }

}

不難看出厘擂,這里線程爭奪的是anyString的對象鎖,兩個線程有競爭同一對象鎖的關系锰瘸,出現(xiàn)同步刽严。

這里的 anyString是在jvm的字符串常量池中,地址是一樣的避凝。所以能保證多個實例對象也能在一個鎖中舞萄。使用synchronized(任意自定義對象)進行同步操作,對象監(jiān)視器必須是同一個對象管削。不過不是同一個鹏氧,運行就是異步執(zhí)行了。這里anyString是同一個對象
同步synchronized(*.class)代碼塊的作用其實和synchronized static方法作用一樣佩谣。Class鎖對類的所有對象實例起作用把还。

synchronize修飾的方法和synchronize(this) 都是鎖住自己本身的對象,synchronized(*.class)是鎖住加載類對象,synchronized(object)是鎖住object對象

轉(zhuǎn)自:https://blog.csdn.net/u013142781/article/details/51697672

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市吊履,隨后出現(xiàn)的幾起案子安皱,更是在濱河造成了極大的恐慌,老刑警劉巖艇炎,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件酌伊,死亡現(xiàn)場離奇詭異,居然都是意外死亡缀踪,警方通過查閱死者的電腦和手機居砖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來驴娃,“玉大人奏候,你說我怎么就攤上這事〈匠ǎ” “怎么了蔗草?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長疆柔。 經(jīng)常有香客問我咒精,道長,這世上最難降的妖魔是什么旷档? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任模叙,我火速辦了婚禮,結果婚禮上鞋屈,老公的妹妹穿的比我還像新娘向楼。我一直安慰自己,他們只是感情好谐区,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著逻卖,像睡著了一般宋列。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上评也,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天炼杖,我揣著相機與錄音,去河邊找鬼盗迟。 笑死坤邪,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的罚缕。 我是一名探鬼主播艇纺,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了黔衡?” 一聲冷哼從身側響起蚓聘,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎盟劫,沒想到半個月后夜牡,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡侣签,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年塘装,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片影所。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡蹦肴,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出型檀,到底是詐尸還是另有隱情冗尤,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布胀溺,位于F島的核電站裂七,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏仓坞。R本人自食惡果不足惜背零,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望无埃。 院中可真熱鬧徙瓶,春花似錦、人聲如沸嫉称。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽织阅。三九已至壳繁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間荔棉,已是汗流浹背闹炉。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留润樱,地道東北人渣触。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像壹若,于是被迫代替她去往敵國和親嗅钻。 傳聞我的和親對象是個殘疾皇子皂冰,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 線程同步 在大多數(shù)實際的多線程應用中, 兩個或兩個以上的線程需要共享對同一數(shù)據(jù)的存取。多個線程或者進程在讀寫一個共...
    Steven1997閱讀 1,928評論 0 3
  • 前言 本人主要是結合《Java多線程編程核心技術》這本書的第二章內(nèi)容啊犬,對synchronized關鍵字的知識進行梳...
    AR7_閱讀 897評論 0 4
  • 我的理解:1灼擂、sync修飾代碼塊時候用的都是對象鎖:synchronized (XXX) 2、當修飾非靜態(tài)方法時候...
    Condor_c33a閱讀 324評論 0 0
  • 1. Java基礎部分 基礎部分的順序:基本語法觉至,類相關的語法剔应,內(nèi)部類的語法,繼承相關的語法语御,異常的語法峻贮,線程的語...
    子非魚_t_閱讀 31,639評論 18 399
  • 從德國到法國、荷蘭应闯,再到丹麥纤控、瑞士、冰島碉纺,在歐洲大陸上看著各種現(xiàn)實版旅游宣傳片里的風景船万,看著一大堆網(wǎng)上都能找到圖片...
    狐貍的窗戶閱讀 4,710評論 1 8