国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

線程的狀態(tài),多線程帶來的風(fēng)險(xiǎn),synchronized關(guān)鍵字及死鎖問題

這篇具有很好參考價(jià)值的文章主要介紹了線程的狀態(tài),多線程帶來的風(fēng)險(xiǎn),synchronized關(guān)鍵字及死鎖問題。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

目錄

狀態(tài)?

線程的意義

多線程帶來的風(fēng)險(xiǎn)——線程安全?

線程安全的概念

線程不安全的原因

搶占式執(zhí)行,隨機(jī)性調(diào)度

修改共享數(shù)據(jù)

原子性->加??

可見性

指令重排序

解決線程不安全問題(學(xué)完線程再總結(jié))

synchronized關(guān)鍵字——監(jiān)視器鎖monitor lock?編輯?

?互斥

使用示例

可重入

Java標(biāo)準(zhǔn)庫中線程安全的類

死鎖

1.死鎖是什么

2.死鎖的三個(gè)典型情況

3.死鎖的四個(gè)必要條件?編輯

4.如何破除死鎖?


狀態(tài)是針對當(dāng)前的線程調(diào)度情況進(jìn)行描述的,所以認(rèn)為線程是程序調(diào)度的基本單位(后面再談狀態(tài)都是考慮線程的狀態(tài)了);

狀態(tài)?

public class ThreadState {
 ? ?public static void main(String[] args) {
 ? ? ? ?for (Thread.State state : Thread.State.values()) {
 ? ? ? ? ? ?System.out.println(state);
 ? ? ? }
 ? }
}

1. NEW : 創(chuàng)建Thread對象,但是還沒調(diào)用start(內(nèi)核還沒創(chuàng)建對應(yīng)的PCB);

2. TERMINATED : 內(nèi)核中的PCB已經(jīng)創(chuàng)建完畢了,但是Thread對象還在;

3. RUNNABLE:可運(yùn)行的;(RUNNABLE是正在CPU上執(zhí)行的,RUNNING是在就緒隊(duì)列上的,可以去CPU上執(zhí)行的);

4.?WAITING

5. TIMED_WAITING

6. BLOCKED

上述三個(gè)都是阻塞,表示線程?PCB 正在阻塞隊(duì)列中,但是原因不同

線程的狀態(tài),多線程帶來的風(fēng)險(xiǎn),synchronized關(guān)鍵字及死鎖問題

線程的狀態(tài),多線程帶來的風(fēng)險(xiǎn),synchronized關(guān)鍵字及死鎖問題

RUNNABLE表示就緒狀態(tài),包含正在CPU上運(yùn)行,或者在就緒隊(duì)列中排隊(duì) ;

當(dāng)有for循環(huán)里有sleep的時(shí)候,t運(yùn)行中的狀態(tài)大部分是TIMED_WAITING, 為了讓時(shí)間均衡,可以給 t 線程中添加更多的計(jì)算邏輯。

如果線程代碼中全是for循環(huán)里計(jì)算,比較大小之類的操作,此時(shí)這個(gè)線程就不會阻塞,始終是RUNNABLE'狀態(tài);

所以,之前我們學(xué)過的 isAlive() 方法,可以認(rèn)為是處于不是 NEW TERMINATED 的狀態(tài)都是活著 的。

線程的意義

程序分成:

CPU密集:包含大量的加減乘除運(yùn)算符;

IO密集:涉及到讀寫文件,讀寫控制臺,讀寫網(wǎng)絡(luò)的操作;

多線程可以更充分的利用到多核心cpu的資源

多線程帶來的風(fēng)險(xiǎn)——線程安全?

起源于多線程的搶占式執(zhí)行帶來的隨機(jī)性。如果沒有多線程,程序的執(zhí)行順序就是固定的;調(diào)度的源頭來自于操作系統(tǒng)的內(nèi)核實(shí)現(xiàn)

線程安全的概念

多個(gè)線程同時(shí)對某個(gè)共享資源進(jìn)行訪問導(dǎo)致的原子性,可見性,有序性的問題,這些問題導(dǎo)致共享資源存在一個(gè)不可預(yù)測性,使執(zhí)行結(jié)果出現(xiàn)不可預(yù)期的結(jié)果。

如果多線程環(huán)境下代碼運(yùn)行的結(jié)果是符合我們預(yù)期的,即在單線程環(huán)境應(yīng)該的結(jié)果,則說這個(gè)程序是線 程安全的。

線程不安全的原因

搶占式執(zhí)行,隨機(jī)性調(diào)度

修改共享數(shù)據(jù)

多個(gè)線程同時(shí)修改一個(gè)變量

string都是不可變對象,所以他線程安全?

原子性->加??

?是不可拆分的基本單位,針對線程安全問題最主要的的手段就是通過加鎖將非原子的轉(zhuǎn)換為“原子”的,
我們把一段代碼想象成一個(gè)房間,每個(gè)線程就是要進(jìn)入這個(gè)房間的人。如果沒有任何機(jī)制保證, A 進(jìn)入 房間之后,還沒有出來;B 是不是也可以進(jìn)入房間,打斷 A 在房間里的隱私。這個(gè)就是不具備原子性 的。
那我們應(yīng)該如何解決這個(gè)問題呢?是不是只要給房間加一把鎖, A 進(jìn)去就把門鎖上,其他人是不是就進(jìn) 不來了。這樣就保證了這段代碼的原子性了。
有時(shí)也把這個(gè)現(xiàn)象叫做同步互斥,表示操作是互相排斥的。
一條 java 語句不一定是原子的,也不一定只是一條指令
比如 ?n++ ,其實(shí)是由三步操作組成的:
1. 從內(nèi)存把數(shù)據(jù)讀到 CPU
2. 進(jìn)行數(shù)據(jù)更新
3. 把數(shù)據(jù)寫回到 CPU
不保證原子性會給多線程帶來什么問題
如果一個(gè)線程正在對一個(gè)變量操作,中途其他線程插入進(jìn)來了,如果這個(gè)操作被打斷了,結(jié)果就可能是 錯(cuò)誤的。
這點(diǎn)也和線程的搶占式調(diào)度密切相關(guān) . 如果線程不是 " 搶占 " , 就算沒有原子性 , 也問題不大 .

可見性

?如果一個(gè)線程讀,一個(gè)線程改,也可能出現(xiàn)問題。

指令重排序

編譯器對于指令重排序的前提是 " 保持邏輯不發(fā)生變化 ". 這一點(diǎn)在單線程環(huán)境下比較容易判斷 ,
是在多線程環(huán)境下就沒那么容易了 , 多線程的代碼執(zhí)行復(fù)雜程度更高 , 編譯器很難在編譯階段對代
碼的執(zhí)行效果進(jìn)行預(yù)測 , 因此激進(jìn)的重排序很容易導(dǎo)致優(yōu)化后的邏輯和之前不等價(jià) .

解決線程不安全問題(學(xué)完線程再總結(jié))

  1. 同步代碼塊
  2. 同步方法

synchronized關(guān)鍵字——監(jiān)視器鎖monitor lock?

?互斥

  • 當(dāng)兩個(gè)線程同時(shí)對一個(gè)對象進(jìn)行加鎖的時(shí)候,會出現(xiàn)鎖沖突/鎖競爭,一個(gè)線程可以獲取到鎖另一個(gè)線程出現(xiàn)線程阻塞的情況 ,直到那個(gè)線程解鎖,它才取鎖成功。
  • 兩個(gè)線程,一個(gè)加鎖,一個(gè)不加鎖,不存在鎖競爭;
  • 兩個(gè)線程針對不同對象加鎖,倆線程獲取到各自的鎖,此時(shí)不存在鎖競爭;
同一個(gè)對象 synchronized 就會 阻塞等待 .
進(jìn)入 synchronized 修飾的代碼塊 , 相當(dāng)于 加鎖
退出 synchronized 修飾的代碼塊 , 相當(dāng)于 解鎖
synchronized 用的鎖是存在 Java 對象頭里的。
線程的狀態(tài),多線程帶來的風(fēng)險(xiǎn),synchronized關(guān)鍵字及死鎖問題

?文章來源地址http://www.zghlxwxcb.cn/news/detail-459691.html

?

使用示例

synchronized關(guān)鍵字

修飾方法(普通方法-加到this對象上,靜態(tài)方法-加到類對象上)

代碼塊-手動指定加到某個(gè)對象上

線程的狀態(tài),多線程帶來的風(fēng)險(xiǎn),synchronized關(guān)鍵字及死鎖問題

線程的狀態(tài),多線程帶來的風(fēng)險(xiǎn),synchronized關(guān)鍵字及死鎖問題?

ctrl+alt+t->選中代碼塊包裹?

可重入

一個(gè)線程針對同一個(gè)對象,連續(xù)加鎖兩次如果沒有問題,?就叫可重入的,否則不可重入(第二次加鎖就會出現(xiàn)阻塞等待的情況,這種情況線程就僵住了,出現(xiàn)死鎖現(xiàn)象)。

這里的死鎖(死鎖的一種情況)如何理解?

靈異事件:滑稽老鐵去廁所,鎖上了門,結(jié)果時(shí)空錯(cuò)亂,它出來了,忘記了去廁所這件事,去廁所發(fā)現(xiàn)門一直都是鎖的。

為了避免上述死鎖,java將synchronized設(shè)定為可重入的。

線程的狀態(tài),多線程帶來的風(fēng)險(xiǎn),synchronized關(guān)鍵字及死鎖問題

?上述圖片可以理解為:

我追到男神,追的過程中給他表白了一次,追到手后再表白了一次,就是“可重入的”,不會出現(xiàn)阻塞等待等。

synchronized 同步塊對同一條線程來說是可重入的,不會出現(xiàn)自己把自己鎖死的問題;

eg:

static class Counter {
 ? ?public int count = 0;
 ? ?synchronized void increase() {
 ? ? ? ?count++;
 ? }
 ? ?synchronized void increase2() {
 ? ? ? ?increase();
 ? }
}
在可重入鎖的內(nèi)部 , 包含了 " 線程持有者 " " 計(jì)數(shù)器 " 兩個(gè)信息 .
1. 如果某個(gè)線程加鎖的時(shí)候 , 發(fā)現(xiàn)鎖已經(jīng)被人占用 , 但是恰好占用的正是自己 , 那么仍然可以繼續(xù)獲取 到鎖, 并讓計(jì)數(shù)器自增 .
2. 解鎖的時(shí)候計(jì)數(shù)器遞減為 0 的時(shí)候 , 才真正釋放鎖 . ( 才能被別的線程獲取)

Java標(biāo)準(zhǔn)庫中線程安全的類

多個(gè)線程操作同一個(gè)集合類,就要考慮到線程安全問題。?

線程的狀態(tài),多線程帶來的風(fēng)險(xiǎn),synchronized關(guān)鍵字及死鎖問題?

還有的類不涉及加鎖,但仍然是線程安全的,因?yàn)椴簧婕靶薷牟僮鳎篠tring;?

?

死鎖

1.死鎖是什么

死鎖是兩個(gè)或兩個(gè)以上的線程在執(zhí)行過程中,去爭奪同一個(gè)共享資源導(dǎo)致的互相等待的過程,在沒有外部干預(yù)的情況下,線程會一直處于阻塞狀態(tài),無法向下執(zhí)行。

死鎖比較隱蔽,一旦寫了死鎖,會出現(xiàn)嚴(yán)重的bug

2.死鎖的三個(gè)典型情況

  • 一個(gè)線程,一把鎖,連續(xù)鎖兩次,如果鎖是不可重入性鎖,就會死鎖;Java里的synchronized和ReentrantLock都是可重入性鎖;
  • 循環(huán)等待:兩個(gè)線程,兩把鎖,t1,t2先各自針對鎖A,鎖B進(jìn)行加鎖,再嘗試獲取對方的鎖。線程1在獲取B的時(shí)候等待線程2釋放B,線程2在獲取A的時(shí)候等待線程1釋放A,造成blocked;(線程1拿到A鎖,再嘗試獲取鎖B,A這把鎖還是繼續(xù)保持的,不會因?yàn)橐カ@取B就把A釋放了)
    public class demo33 {
        public static void main(String[] args) {
            Object jiangyou=new Object();
            Object cu=new Object();
            Thread tanglaoshi=new Thread(()->{
                synchronized(jiangyou){
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                    synchronized (cu){
                        System.out.println("湯老師拿到了醬油和醋");
                    }
                }
            });
             Thread shiniang=new Thread(()->{
                synchronized(cu){
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                    synchronized (jiangyou){
                        System.out.println("師娘拿到了醬油和醋");
                    }
                }
            });
        }
    }
    //用jconsole定位到這兩個(gè)線程的第二個(gè)??操作出現(xiàn)了BLOCKED操作;

    線程的狀態(tài),多線程帶來的風(fēng)險(xiǎn),synchronized關(guān)鍵字及死鎖問題

    ?

  • 多個(gè)線程,多把鎖?
    線程的狀態(tài),多線程帶來的風(fēng)險(xiǎn),synchronized關(guān)鍵字及死鎖問題
    當(dāng)他們都拿起左手的筷子就會出現(xiàn)極端情況。

3.死鎖的四個(gè)必要條件

4.如何破除死鎖?

去破壞死鎖中的必要條件中的任意一個(gè)(除了互斥條件),給鎖編號,然后制定一個(gè)固定的順序(從小到大)來加鎖,任意線程加多把鎖的時(shí)候,都讓線程遵循上述循序,此時(shí)循環(huán)等待自然破除。eg:對于上面的代碼就可以通過把鎖的內(nèi)容換一下 。?

還有解決死鎖的銀行家算法。

對于死鎖,我們需要借助jconsole這樣的工具來定位。 在問到死鎖時(shí),記得再解釋下可重入,不可重入

線程的狀態(tài),多線程帶來的風(fēng)險(xiǎn),synchronized關(guān)鍵字及死鎖問題

?

到了這里,關(guān)于線程的狀態(tài),多線程帶來的風(fēng)險(xiǎn),synchronized關(guān)鍵字及死鎖問題的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Java 關(guān)鍵字:synchronized詳解

    Java 關(guān)鍵字:synchronized詳解

    Java中的synchronized用于在多線程環(huán)境下確保數(shù)據(jù)同步。它可以用來修飾方法和代碼塊 當(dāng)一個(gè)線程訪問一個(gè)對象的synchronized方法或代碼塊時(shí),其他線程將無法訪問該對象的其他synchronized方法或代碼塊。這樣可以確保在同一時(shí)間只有一個(gè)線程能夠執(zhí)行該代碼塊或方法,避免

    2024年02月08日
    瀏覽(16)
  • 【JavaEE】Java中復(fù)雜的Synchronized關(guān)鍵字

    【JavaEE】Java中復(fù)雜的Synchronized關(guān)鍵字

    目錄 ?一、synchronized的特性 (1)互斥 (2)刷新內(nèi)存 (3)可重入 二、synchronized的使用 (1)修飾普通方法 (2)修飾靜態(tài)方法 (3)修飾代碼塊 三、synchronized的鎖機(jī)制 (1)基本特點(diǎn) (2)加鎖工作過程 1.偏向鎖 2.輕量級鎖 3.重量級鎖 (3)優(yōu)化操作 1.鎖消除 2.鎖粗化 四、

    2024年01月19日
    瀏覽(22)
  • Java并發(fā)之synchronized關(guān)鍵字和Lock接口

    歡迎點(diǎn)贊閱讀,一同學(xué)習(xí)交流,有疑問請留言 。 GitHub上也有開源 JavaHouse,歡迎star 當(dāng)開發(fā)過程中,我們遇到并發(fā)問題。怎么解決? 一種解決方式,簡單粗暴:上鎖。將千軍萬馬都給攔下來,只允許一個(gè)人過獨(dú)木橋。書面意思就是將并行的程序變成串行的程序?,F(xiàn)實(shí)的鎖有門鎖

    2024年02月08日
    瀏覽(22)
  • Java 八股文面試過程系列之synchronized關(guān)鍵字

    本文通過一場虛擬的面試對話,詳細(xì)解析了Java中的synchronized關(guān)鍵字。從基本用法到底層實(shí)現(xiàn)原理,再到性能優(yōu)化策略,全面提升您對同步機(jī)制的理解。

    2024年02月07日
    瀏覽(36)
  • 《吊打面試官系列》從源碼全面解析 synchronized 關(guān)鍵字的來龍去脈

    《吊打面試官系列》從源碼全面解析 synchronized 關(guān)鍵字的來龍去脈

    ??作者簡介:大家好,我是愛敲代碼的小黃,獨(dú)角獸企業(yè)的Java開發(fā)工程師,CSDN博客專家,阿里云專家博主 ??系列專欄:Java設(shè)計(jì)模式、數(shù)據(jù)結(jié)構(gòu)和算法、Kafka從入門到成神、Kafka從成神到升仙、Spring從成神到升仙系列 ??如果感覺博主的文章還不錯(cuò)的話,請??三連支持??一

    2023年04月16日
    瀏覽(14)
  • 【多線程】volatile關(guān)鍵字

    一、volatile 1.volatile的底層原理是內(nèi)存屏障,Memory Barrier, Memory Fence 2.對volatile變量的寫指令(賦值操作)后會加入寫屏障 3.對volatile變量的讀指令(取變量值)前會加入讀屏障 4.寫屏障的作用會將寫屏障之前的賦值改動操作,對共享變量的改動都同步到主內(nèi)存中 5.讀屏障的作

    2024年02月06日
    瀏覽(20)
  • Java多線程系列——同步關(guān)鍵字

    目錄 一、線程安全和數(shù)據(jù)不一致性 二、synchronized的作用 三、synchronized工作原理 四、鎖的級別 五、synchronized的優(yōu)點(diǎn)與缺點(diǎn) 六、實(shí)戰(zhàn)應(yīng)用 七、總結(jié) 在Java中, synchronized 是并發(fā)編程中的一個(gè)基本構(gòu)建塊,用于控制多個(gè)線程對共享資源的訪問,以確保數(shù)據(jù)的一致性

    2024年02月21日
    瀏覽(17)
  • 多線程系列(四) -volatile關(guān)鍵字使用詳解

    多線程系列(四) -volatile關(guān)鍵字使用詳解

    在上篇文章中,我們介紹到在多線程環(huán)境下,如果編程不當(dāng),可能會出現(xiàn)程序運(yùn)行結(jié)果混亂的問題。 出現(xiàn)這個(gè)原因主要是,JMM 中主內(nèi)存和線程工作內(nèi)存的數(shù)據(jù)不一致,以及多個(gè)線程執(zhí)行時(shí)無序,共同導(dǎo)致的結(jié)果。 同時(shí)也提到引入 synchronized 同步鎖,可以保證線程同步,讓多

    2024年02月21日
    瀏覽(25)
  • 線程中并發(fā)安全問題(Sychronized關(guān)鍵字的底層原理)

    線程中并發(fā)安全問題(Sychronized關(guān)鍵字的底層原理)

    Sychronized的底層原理 ? sychronized 對象鎖采用互斥方式讓同一時(shí)刻至多只有一個(gè)線程能持有對象鎖,其他線程想獲取這個(gè)對象鎖只能被阻塞。 Monitor Sychronized的底層實(shí)現(xiàn)Monitor。 WaitSet:關(guān)聯(lián)調(diào)用了wait方法的線程,用于存儲處于等待狀態(tài)的線程。 EntryList:關(guān)聯(lián)了沒有獲得

    2024年02月16日
    瀏覽(22)
  • 【C語言趣味教程】(7) 存儲類:auto 關(guān)鍵字 | register 關(guān)鍵字 | 存儲期 | 自動存儲期 | 動態(tài)存儲期 | 線程存儲期 | 動態(tài)分配存儲期 | 靜態(tài)變量

    【C語言趣味教程】(7) 存儲類:auto 關(guān)鍵字 | register 關(guān)鍵字 | 存儲期 | 自動存儲期 | 動態(tài)存儲期 | 線程存儲期 | 動態(tài)分配存儲期 | 靜態(tài)變量

    ??? ?? 《C語言趣味教程》?? 猛戳訂閱!??! 0x00 引入:什么是存儲類別? ? 你沒有聽說過 \\\"存儲類別\\\" 的概念? ?? 存儲類別 ?(Storage Class) 在 C 語言標(biāo)準(zhǔn)中用來 規(guī)定變量與函數(shù)的可訪問性與生命周期。 \\\"可訪問性\\\" 的概念就是我們上一章說的作用域范圍,我們先關(guān)注以下

    2024年02月10日
    瀏覽(36)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包