成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Synchronized關(guān)鍵字的底層原理?

開發(fā) 前端
在 Java 中,關(guān)鍵字 synchronized 可以保證在同一個(gè)時(shí)刻,只有一個(gè)線程可以執(zhí)行某個(gè)方法或者某個(gè)代碼塊(主要是對方法或者代碼塊中存在共享數(shù)據(jù)的操作),同時(shí)我們還應(yīng)該注意到 synchronized 的另外一個(gè)重要的作用,synchronized 可保證一個(gè)線程的變化(主要是共享數(shù)據(jù)的變化)被其他線程所看到。

1. synchronized的基本使用

在現(xiàn)實(shí)場景中,搶票代碼,如果不加鎖,就會(huì)出現(xiàn)超賣或者一張票賣給多個(gè)人

Synchronized對象鎖采用互斥的方式讓同一時(shí)刻至多只有一個(gè)線程能持有對象鎖,其它線程再想獲取這個(gè)對象鎖時(shí)就會(huì)阻塞住,代碼如下

public class synchronizedTest {
    // 創(chuàng)建一個(gè)靜態(tài)對象作為鎖
    static Object lock = new Object();
    // 初始票數(shù)
    int ticketNum = 20;

    // 獲取票的方法,使用 synchronized 修飾確保線程安全
    public synchronized void getTicket() {
        // 使用當(dāng)前對象作為鎖
        synchronized (this) {
            // 如果票數(shù)已經(jīng)為零,則返回
            if (ticketNum <= 0) {
                return;
            }
            System.out.println(Thread.currentThread().getName() + "搶到一張票,剩余:" + ticketNum);
            // 非原子性操作,扣除一張票
            ticketNum--;
        }
    }

    public static void main(String[] args) {
        // 創(chuàng)建 synchronizedTest 實(shí)例
        synchronizedTest synchronizedTest = new synchronizedTest();
        // 創(chuàng)建并啟動(dòng) 20 個(gè)線程
        for (int i = 0; i < 20; i++) {
            // 調(diào)用獲取票的方法
            new Thread(() -> synchronizedTest.getTicket()).start();
        }
    }
}

通過以上代碼,加synchronized鎖,就可以防止超賣

特別說明:synchronized 關(guān)鍵字的底層實(shí)現(xiàn)涉及到 Java 虛擬機(jī)中的監(jiān)視器(Monitor)機(jī)制。每個(gè) Java 對象都與一個(gè) Monitor 相關(guān)聯(lián),Monitor 負(fù)責(zé)對象的鎖定和解鎖,以及線程的阻塞和喚醒。

2. Monitor

Monitor 被翻譯為監(jiān)視器,是由jvm提供,c++語言實(shí)現(xiàn)

使用一下簡單代碼中查看monitor,通過javap命令查看clsss的字節(jié)碼

public class MonitorTest {
    static final Object lock = new Object();
    static int counter = 0;
    public static void main(String[] args) {
        synchronized (lock) {
            counter++;
        }
    }
}

圖片圖片

  • monitorenter: 上鎖開始的地方
  • monitorexit:  解鎖的地方
  • 其中被monitorenter和monitorexit包圍住的指令就是上鎖的代碼

思考:為什么會(huì)出現(xiàn)兩個(gè)monitorexit

有兩個(gè)monitorexit的原因,第二個(gè)monitorexit是為了防止鎖住的代碼拋異常后不能及時(shí)釋放鎖在使用了synchornized代碼塊時(shí)需要指定一個(gè)對象,所以synchornized也被稱為對象鎖

monitor主要就是跟這個(gè)對象產(chǎn)生關(guān)聯(lián),如下圖

圖片圖片

Monitor內(nèi)部具體的存儲(chǔ)結(jié)構(gòu):

  • Owner:存儲(chǔ)當(dāng)前獲取鎖的線程的,只能有一個(gè)線程可以獲取
  • EntryList:關(guān)聯(lián)沒有搶到鎖的線程,處于Blocked狀態(tài)的線程
  • WaitSet:關(guān)聯(lián)調(diào)用了wait方法的線程,處于Waiting狀態(tài)的線程

具體的流程:

  • 代碼進(jìn)入synchorized代碼塊,先讓lock(對象鎖)關(guān)聯(lián)的monitor,然后判斷Owner是否有線程持有
  • 如果沒有線程持有,則讓當(dāng)前線程持有,表示該線程獲取鎖成功
  • 如果有線程持有,則讓當(dāng)前線程進(jìn)入entryList進(jìn)行阻塞,如果Owner持有的線程已經(jīng)釋放了鎖,在EntryList中的線程去競爭鎖的持有權(quán)(非公平)
  • 如果代碼塊中調(diào)用了wait()方法,則會(huì)進(jìn)去WaitSet中進(jìn)行等待

3.面試題

面試官:synchronized關(guān)鍵字的底層原理?

  • Synchronized【對象鎖】
  • 采用互斥的方式讓同一時(shí)刻至多只有一個(gè)線程能持有【對象鎖】
  • 它的底層由monitor實(shí)現(xiàn)的,monitor是jvm級別的對象( C++實(shí)現(xiàn)),線程獲得鎖需要使用對象(鎖)關(guān)聯(lián)monitor
  • 在monitor內(nèi)部有三個(gè)屬性,分別是owner、entrylist、waitset
  • 其中owner是關(guān)聯(lián)的獲得鎖的線程,并且只能關(guān)聯(lián)一個(gè)線程;entrylist關(guān)聯(lián)的是處于阻塞狀態(tài)的線程;waitset關(guān)聯(lián)的是處于Waiting狀態(tài)的線程
責(zé)任編輯:武曉燕 來源: springboot葵花寶典
相關(guān)推薦

2019-12-20 15:19:41

Synchroinze線程安全

2021-01-12 09:22:18

Synchronize線程開發(fā)技術(shù)

2024-11-20 15:55:57

線程Java開發(fā)

2021-03-10 15:59:39

JavaSynchronize并發(fā)編程

2022-01-26 00:03:00

關(guān)鍵字線程JVM

2009-08-12 13:37:01

Java synchr

2017-05-27 20:59:30

Java多線程synchronize

2021-08-15 08:11:54

AndroidSynchronize關(guān)鍵字

2021-01-08 08:34:09

Synchronize線程開發(fā)技術(shù)

2022-12-26 09:27:48

Java底層monitor

2009-06-29 18:26:11

Java多線程Synchronize同步類

2011-03-09 14:36:44

synchronizevolatile

2022-11-12 18:32:50

Golangomitemptyjson

2022-02-17 08:31:38

C語言staic關(guān)鍵字

2022-05-06 08:32:40

Pythonwith代碼

2021-02-01 13:10:07

Staticc語言UNIX系統(tǒng)

2025-01-09 10:30:40

2023-05-15 09:39:10

Java監(jiān)視器鎖

2009-08-21 14:58:56

C# this關(guān)鍵字

2013-01-30 10:12:14

Pythonyield
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 欧美一区二区三区在线观看视频 | 在线伊人| 视频一区二区三区在线观看 | 亚洲国产一区二区视频 | 国产一区二区精品在线 | 我要看免费一级毛片 | 亚洲精品美女视频 | 午夜精品久久久久久久星辰影院 | 91看片在线观看 | 麻豆changesxxx国产 | 一区二区免费 | 国产激情91久久精品导航 | 久久亚洲一区 | 国内精品久久影院 | 国产精品电影网 | 国产a视频| 日日干日日射 | 波多野结衣电影一区 | 久久99这里只有精品 | 美女视频一区二区三区 | 午夜在线影院 | 国产乱码精品1区2区3区 | 亚洲情综合五月天 | 国产黄色大片在线免费观看 | 久久亚洲欧美日韩精品专区 | 夜夜爽99久久国产综合精品女不卡 | 免费激情网站 | 欧美激情亚洲激情 | 国产 欧美 日韩 一区 | 精品久久一 | 免费在线国产视频 | 国内精品久久久久久久影视简单 | 国产三级国产精品 | 91视频大全 | 久久最新 | 国产一区h | 午夜视频免费在线 | 在线视频91 | 91精品国产乱码久久久久久久 | 中文字幕电影在线观看 | 女女百合av大片一区二区三区九县 |