最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java線程狀態(tài)及同步鎖的操作方法

 更新時(shí)間:2021年11月15日 17:14:48   作者:Thales_ZeeWay  
Java中的thread類自帶有線程的一些方法,這些方法可以讓線程睡眠,插隊(duì),提高線程調(diào)度的優(yōu)先級(jí)等等,它們提供了改變線程狀態(tài)的操作手段,這篇文章主要介紹了Java線程狀態(tài)及同步鎖,需要的朋友可以參考下

線程的生命歷程

線程的五大狀態(tài)

  • 創(chuàng)建狀態(tài):簡(jiǎn)而言之,當(dāng)創(chuàng)建線程對(duì)象的代碼出現(xiàn)的時(shí)候,此時(shí)線程就進(jìn)入了創(chuàng)建狀態(tài)。這時(shí)候的線程只是行代碼而已。只有調(diào)用線程的start()方法時(shí),線程的狀態(tài)才會(huì)改變,進(jìn)入就緒狀態(tài)
  • 就緒狀態(tài):在這個(gè)狀態(tài)下的線程,已經(jīng)做好了隨時(shí)運(yùn)行的準(zhǔn)備,但是并不意味著會(huì)立刻開始運(yùn)行。還需要等待CPU的隨機(jī)調(diào)度,隨機(jī)運(yùn)行。只有當(dāng)線程被CPU調(diào)度運(yùn)行成功,此時(shí)的線程才算是進(jìn)入下一個(gè)狀態(tài)——運(yùn)行狀態(tài)。
  • 運(yùn)行狀態(tài):線程處于運(yùn)行狀態(tài),主要是在運(yùn)行線程中的代碼塊。
  • 阻塞狀態(tài):在線程運(yùn)行過程中,當(dāng)線程代碼塊中調(diào)用了線程的sleep(),yield(),同步鎖定或者其他使線程阻塞的方法,此時(shí)的線程無法繼續(xù)運(yùn)行下去,進(jìn)入了阻塞狀態(tài)(線程代碼塊的自身邏輯混亂也可以使線程阻塞)。當(dāng)造成線程阻塞的阻塞事件解決之后,線程不會(huì)回到運(yùn)行狀態(tài),而是回到就緒狀態(tài),再次等待CPU的調(diào)度運(yùn)行。需要注意的是,阻塞并不意味著線程運(yùn)行終止
  • 死亡狀態(tài):當(dāng)線程成功運(yùn)行完所有的代碼之后,線程就結(jié)束了,也進(jìn)入了死亡狀態(tài)。線程一旦死亡,就無法再次啟動(dòng),注意這里和阻塞狀態(tài)的不同。同樣的,當(dāng)線程運(yùn)行一半的時(shí)候被強(qiáng)行結(jié)束終止,也算進(jìn)入死亡狀態(tài),也無法被再次啟動(dòng)。

線程的方法

Java中的thread類自帶有線程的一些方法,這些方法可以讓線程睡眠,插隊(duì),提高線程調(diào)度的優(yōu)先級(jí)等等,它們提供了改變線程狀態(tài)的操作手段。(不過在JDK幫助文檔中,一些方法已經(jīng)不推薦使用)

線程方法中的一些有趣的地方

  • 線程睡眠是以毫秒為單位的。一秒等于一千毫秒。一般在測(cè)試程序中調(diào)用睡眠方法,是為了提高程序問題的發(fā)生性,或者說為了發(fā)現(xiàn)bug
  • 線程停止,由于Java中自帶的停止方法不太好用,所以一般都是自己寫一個(gè)停止的方法,標(biāo)定一個(gè)布爾類型的Flag作為線程執(zhí)行的標(biāo)志,當(dāng)flag為真時(shí)線程運(yùn)行,當(dāng)flag為假時(shí)線程停止。
  • 線程禮讓是將正在運(yùn)行的線程暫停回到就緒狀態(tài),而不是變?yōu)樽枞麪顟B(tài)。有趣的是禮讓不是一定會(huì)成功的,因?yàn)榫€程由就緒狀態(tài)進(jìn)入運(yùn)行狀態(tài)是由CPU隨機(jī)調(diào)度的。所以禮讓的線程有可能在下次的調(diào)度中再次提前調(diào)度,提前運(yùn)行。
  • 線程插隊(duì)(join方法),強(qiáng)制阻塞其他線程,只有插入的線程執(zhí)行完成之后,其他線程才能繼續(xù)執(zhí)行
  • 線程雖然有優(yōu)先級(jí)的區(qū)別(1-10),但是在實(shí)際運(yùn)行中還是得看CPU的心情調(diào)度運(yùn)行,優(yōu)先級(jí)高只是被調(diào)度的概率高一點(diǎn)。Java中自帶有線程優(yōu)先級(jí)的查看和改變方法(線程的優(yōu)先級(jí)設(shè)置最好在線程啟動(dòng)之前)
public class ttp {
    public static void main(String[] args) {
        //主線程的默認(rèn)優(yōu)先級(jí)
        System.out.println(Thread.currentThread().getName()+"--->" + Thread.currentThread().getPriority());
        MyPriorty mm = new MyPriorty();
        Thread t1 = new Thread(mm);
        Thread t2 = new Thread(mm);
        Thread t3 = new Thread(mm);


        
        t1.setPriority(10);
        t1.start();

        t2.setPriority(4);
        t2.start();

        t3.setPriority(6);
        t3.start();


    }
}

//Runnable接口實(shí)現(xiàn)接口,run方法為打印線程名稱和線程的優(yōu)先級(jí)
class MyPriorty implements Runnable{
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+"--->" + Thread.currentThread().getPriority());
    }
}
//這里的輸出有多種結(jié)果,因?yàn)閮?yōu)先級(jí)只是增加了線程被調(diào)度運(yùn)行的機(jī)率

用戶線程和守護(hù)線程。守護(hù)線程的作用是保證用戶線程的執(zhí)行過程正常,例如Java中的內(nèi)存回收線程和后臺(tái)記錄操作日志等等,這些都是守護(hù)線程。虛擬機(jī)必須等待用戶線程執(zhí)行完畢,不用等待守護(hù)線程執(zhí)行完畢。當(dāng)用戶線程完成后,虛擬機(jī)就自動(dòng)關(guān)閉,守護(hù)線程也就自動(dòng)死亡了。

//Java的Thread類自帶設(shè)置守護(hù)線程的方法
Thread.setdaemon(true) //設(shè)置為守護(hù)線程
//一般我們創(chuàng)建的線程默認(rèn)都是用戶線程

線程同步。線程同步是出現(xiàn)多個(gè)線程訪問同一個(gè)對(duì)象并都想對(duì)其進(jìn)行操作的時(shí)候必須考慮的問題。不進(jìn)行線程同步(并發(fā))控制的多線程是不安全的。

//線程不安全,出現(xiàn)了-1張票以及有兩個(gè)線程拿到同一張票的錯(cuò)誤,所以這是一個(gè)不安全的線程
public class test05 {

    public static void main(String[] args) {
        buyTicket b1 = new buyTicket();
        Thread t1 = new Thread(b1,"you");
        Thread t2 = new Thread(b1,"i");
        Thread t3 = new Thread(b1,"he");
        Thread t4 = new Thread(b1,"she");
        t1.start();
        t2.start();
        t3.start();
        t4.start();

    }
}


class buyTicket implements Runnable{
    //剩余票數(shù)
    private int ticketNums = 12;
    private boolean flag = true;

    @Override
    public void run() {
        while(flag){
            buy();
        }
    }

    private void buy(){
        if(ticketNums <= 0){
            flag = false;
            return;
        }
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + "買到了第" + ticketNums-- + "張票");
    }
}

線程同步

線程同步實(shí)質(zhì)上是一個(gè)等待機(jī)制。線程同步時(shí)會(huì)將多個(gè)線程放入對(duì)象等待池中進(jìn)行排隊(duì)(隊(duì)列),等待前一個(gè)線程執(zhí)行操作完畢,再有下一個(gè)線程進(jìn)行執(zhí)行操作。每個(gè)對(duì)象都有一個(gè)獨(dú)有的鎖(排他鎖),每個(gè)線程執(zhí)行時(shí)都會(huì)獲得對(duì)象的排他鎖,這樣只有獲得鎖的線程可以對(duì)對(duì)象進(jìn)行操作,執(zhí)行結(jié)束后排他鎖被下一個(gè)線程獲得??偨Y(jié)來說,線程同步的形成條件就是:隊(duì)列+鎖。

在訪問時(shí)加入鎖機(jī)制synchronized,當(dāng)一個(gè)線程獲得對(duì)象得排他鎖,獨(dú)占資源,其他線程必須等待,使用后釋放鎖即可

線程同步也有一些存在的問題(大部分是以犧牲性能以保證安全)

  • 一個(gè)線程持有鎖會(huì)導(dǎo)致其他所有需要此鎖的線程掛起
  • 在多線程競(jìng)爭(zhēng)下,加鎖,釋放鎖會(huì)導(dǎo)致較多的上下文切換和調(diào)度延時(shí),引起性能問題
  • 如果一個(gè)優(yōu)先級(jí)高的線程等待一個(gè)優(yōu)先級(jí)低的線程釋放鎖,會(huì)導(dǎo)致優(yōu)先級(jí)倒置,引起性能問題

一般來說,synchronized是方法聲明中添加,默認(rèn)對(duì)方法中的this對(duì)象資源添加鎖。如果要對(duì)其他共享資源對(duì)象進(jìn)行鎖定,則要使用同步監(jiān)視器

  • 一號(hào)線程訪問,鎖定監(jiān)視器,開始執(zhí)行中間的代碼
  • 二號(hào)線程訪問,發(fā)現(xiàn)監(jiān)視器被鎖,無法訪問,掛起
  • 一號(hào)線程執(zhí)行完畢,解鎖監(jiān)視器
  • 二號(hào)線程訪問,監(jiān)視器無鎖,鎖定并執(zhí)行代碼
public void xxx(){
    //其中ob就是想要鎖住的任意的共享資源對(duì)象
    //代碼塊是放在同步監(jiān)視器中的
    synchronized(obj){
        ....
    }
}

需要注意的是,這樣的鎖理論上是可行的 ,但是在實(shí)際運(yùn)行中雖然加了鎖,但是還是有可能出現(xiàn)不安全的現(xiàn)象

到此這篇關(guān)于Java線程狀態(tài)及同步鎖的文章就介紹到這了,更多相關(guān)Java線程狀態(tài)及同步鎖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JAVA-NIO之Socket/ServerSocket Channel(詳解)

    JAVA-NIO之Socket/ServerSocket Channel(詳解)

    下面小編就為大家?guī)硪黄狫AVA-NIO之Socket/ServerSocket Channel(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-06-06
  • Maven pom.xml文件中build,plugin標(biāo)簽的使用小結(jié)

    Maven pom.xml文件中build,plugin標(biāo)簽的使用小結(jié)

    本文主要介紹了Maven pom.xml文件中build,plugin標(biāo)簽的使用小結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-03-03
  • Spring容器初始化及問題解決方案

    Spring容器初始化及問題解決方案

    這篇文章主要介紹了Spring容器初始化及問題解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • SpringBoot使用Kaptcha實(shí)現(xiàn)驗(yàn)證碼的生成與驗(yàn)證功能

    SpringBoot使用Kaptcha實(shí)現(xiàn)驗(yàn)證碼的生成與驗(yàn)證功能

    這篇文章主要介紹了SpringBoot使用Kaptcha實(shí)現(xiàn)驗(yàn)證碼的生成與驗(yàn)證功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • 淺談Java中格式化輸出

    淺談Java中格式化輸出

    這篇文章主要介紹了Java中格式化輸出,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • java微信開發(fā)API第二步 獲取和回復(fù)消息

    java微信開發(fā)API第二步 獲取和回復(fù)消息

    這篇文章主要為大家詳細(xì)介紹了java微信開發(fā)API第二步,獲取消息和回復(fù)消息,感興趣的小伙伴們可以參考一下
    2016-06-06
  • Java二叉搜索樹遍歷操作詳解【前序、中序、后序、層次、廣度優(yōu)先遍歷】

    Java二叉搜索樹遍歷操作詳解【前序、中序、后序、層次、廣度優(yōu)先遍歷】

    這篇文章主要介紹了Java二叉搜索樹遍歷操作,結(jié)合實(shí)例形式詳細(xì)分析了Java二叉搜索樹前序、中序、后序、層次、廣度優(yōu)先遍歷等相關(guān)原理與操作技巧,需要的朋友可以參考下
    2020-03-03
  • Java命令設(shè)計(jì)模式優(yōu)雅解耦命令和執(zhí)行提高代碼可維護(hù)性

    Java命令設(shè)計(jì)模式優(yōu)雅解耦命令和執(zhí)行提高代碼可維護(hù)性

    本文介紹了Java命令設(shè)計(jì)模式,它將命令請(qǐng)求封裝成對(duì)象,以達(dá)到解耦命令請(qǐng)求和執(zhí)行者的目的,從而提高代碼可維護(hù)性。本文詳細(xì)闡述了該模式的設(shè)計(jì)原則、實(shí)現(xiàn)方法和優(yōu)缺點(diǎn),并提供了實(shí)際應(yīng)用場(chǎng)景和代碼示例,幫助讀者深入理解和應(yīng)用該模式
    2023-04-04
  • springboot Junit 執(zhí)行順序詳解

    springboot Junit 執(zhí)行順序詳解

    這篇文章主要介紹了springboot Junit 執(zhí)行順序,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • SpringBoot中的靜態(tài)資源訪問的實(shí)現(xiàn)

    SpringBoot中的靜態(tài)資源訪問的實(shí)現(xiàn)

    這篇文章主要介紹了SpringBoot中的靜態(tài)資源訪問的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09

最新評(píng)論

福安市| 灵武市| 廉江市| 长乐市| 大英县| 新绛县| 温州市| 太仆寺旗| 葵青区| 惠来县| 绍兴县| 达拉特旗| 堆龙德庆县| 千阳县| 万州区| 滦南县| 民乐县| 浦城县| 察雅县| 土默特左旗| 比如县| 资讯 | 晋州市| 宁阳县| 万源市| 武定县| 南昌市| 家居| 襄垣县| 柳河县| 巴塘县| 榆中县| 博野县| 浏阳市| 华安县| 洪洞县| 淮滨县| 饶阳县| 肇庆市| 罗江县| 嵊州市|