成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

java多線程 線程安全問題

hover_lew / 3403人閱讀

摘要:當(dāng)多個(gè)線程同時(shí)共享,同一個(gè)全局變量或靜態(tài)變量,做寫的操作時(shí),可能會(huì)發(fā)生數(shù)據(jù)沖突問題,也就是線程安全問題。

當(dāng)多個(gè)線程同時(shí)共享,同一個(gè)全局變量或靜態(tài)變量,做寫的操作時(shí),可能會(huì)發(fā)生數(shù)據(jù)沖突問題,也就是線程安全問題。但是做讀操作是不會(huì)發(fā)生數(shù)據(jù)沖突問題

模擬線程安全問題
public class SafeThread implements Runnable {

    private int ticketCount = 50;

    @Override
    public void run() {
        while (ticketCount > 0) {
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + ",出售第" + (50 - ticketCount + 1) + "張票");
            ticketCount--;
        }
    }
}
@RequestMapping("test-safe")
    public void testSafe() {
        SafeThread safeThread = new SafeThread();
        Thread t1 = new Thread(safeThread, "thread-1");
        Thread t2 = new Thread(safeThread, "thread-2");
        t1.start();
        t2.start();
    }

結(jié)果:火車票會(huì)重復(fù)出售

解決辦法

使用多線程之間同步synchronized或使用鎖(lock)
1.同步代碼塊

public class SafeThread implements Runnable {

    private int ticketCount = 50;

    @Override
    public void run() {
        while (ticketCount > 0) {
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized (this) {
                System.out.println(Thread.currentThread().getName() + ",出售第" + (50 - ticketCount + 1) + "張票");
                ticketCount--;
            }
        }
    }
}

2.同步方法

public class SafeThread implements Runnable {

    private int ticketCount = 50;

    @Override
    public void run() {
        while (ticketCount > 0) {
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
//            synchronized (this) {
//                System.out.println(Thread.currentThread().getName() + ",出售第" + (50 - ticketCount + 1) + "張票");
//                ticketCount--;
//            }
            sale();
        }
    }

    private synchronized void sale() {
        System.out.println(Thread.currentThread().getName() + ",出售第" + (50 - ticketCount + 1) + "張票");
        ticketCount--;
    }
}

注意:同步函數(shù)使用this鎖

3.靜態(tài)同步函數(shù)
方法上加上static關(guān)鍵字,使用synchronized 關(guān)鍵字修飾或者使用類.class文件。
靜態(tài)的同步函數(shù)使用的鎖是該函數(shù)所屬字節(jié)碼文件對(duì)象
可以用 getClass方法獲取,也可以用當(dāng)前類名.class 表示

public class SafeThread implements Runnable {

    private int ticketCount = 50;

    @Override
    public void run() {
        while (ticketCount > 0) {
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
//            synchronized (this) {
//                System.out.println(Thread.currentThread().getName() + ",出售第" + (50 - ticketCount + 1) + "張票");
//                ticketCount--;
//            }
//            sale();
            sale2();
        }
    }

    private synchronized void sale() {
        System.out.println(Thread.currentThread().getName() + ",出售第" + (50 - ticketCount + 1) + "張票");
        ticketCount--;
    }


    private void sale2() {
        synchronized (SafeThread.class) {
            System.out.println(Thread.currentThread().getName() + ",出售第" + (50 - ticketCount + 1) + "張票");
            ticketCount--;
        }
    }
}
死鎖問題

同步中嵌套同步,導(dǎo)致鎖無法釋放
解決辦法:盡量避免同步中嵌套同步

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/74525.html

相關(guān)文章

  • 40道阿里巴巴JAVA研發(fā)崗線程面試題詳解,你能答出

    摘要:但是單核我們還是要應(yīng)用多線程,就是為了防止阻塞。多線程可以防止這個(gè)問題,多條線程同時(shí)運(yùn)行,哪怕一條線程的代碼執(zhí)行讀取數(shù)據(jù)阻塞,也不會(huì)影響其它任務(wù)的執(zhí)行。 1、多線程有什么用?一個(gè)可能在很多人看來很扯淡的一個(gè)問題:我會(huì)用多線程就好了,還管它有什么用?在我看來,這個(gè)回答更扯淡。所謂知其然知其所以然,會(huì)用只是知其然,為什么用才是知其所以然,只有達(dá)到知其然知其所以然的程度才可以說是把一個(gè)知識(shí)點(diǎn)...

    lpjustdoit 評(píng)論0 收藏0
  • 線程基礎(chǔ)必要知識(shí)點(diǎn)!看了學(xué)習(xí)線程事半功倍

    摘要:是需要我們?nèi)ヌ幚砗芏嗍虑?,為了防止多線程給我們帶來的安全和性能的問題下面就來簡(jiǎn)單總結(jié)一下我們需要哪些知識(shí)點(diǎn)來解決多線程遇到的問題。 前言 不小心就鴿了幾天沒有更新了,這個(gè)星期回家咯。在學(xué)校的日子要努力一點(diǎn)才行! 只有光頭才能變強(qiáng) 回顧前面: 多線程三分鐘就可以入個(gè)門了! Thread源碼剖析 本文章的知識(shí)主要參考《Java并發(fā)編程實(shí)戰(zhàn)》這本書的前4章,這本書的前4章都是講解并發(fā)的基...

    YPHP 評(píng)論0 收藏0
  • 學(xué)習(xí)Java線程的一些總結(jié)

    摘要:多線程環(huán)境下的一些問題安全性問題在沒有正確同步的情況下,多線程環(huán)境下程序可能得出錯(cuò)誤的結(jié)果。一些相關(guān)概念競(jìng)爭(zhēng)條件多線程的環(huán)境下,程序執(zhí)行的結(jié)果取決于線程交替執(zhí)行的方式。而線程的交替操作順序是不可預(yù)測(cè)的,如此程序執(zhí)行的結(jié)果也是不可預(yù)測(cè)的。 入口 Java多線程的應(yīng)用復(fù)雜性之如jvm有限的幾個(gè)內(nèi)存方面的操作和規(guī)范,就像無數(shù)紛繁復(fù)雜的應(yīng)用邏輯建立在有限的指令集上。 如何寫出線程安全的程序,有...

    coolpail 評(píng)論0 收藏0
  • Java 并發(fā)編程系列之帶你了解線程

    摘要:的內(nèi)置鎖是一種互斥鎖,意味著最多只有一個(gè)線程能持有這種鎖。使用方式如下使用顯示鎖之前,解決多線程共享對(duì)象訪問的機(jī)制只有和。后面會(huì)陸續(xù)的補(bǔ)充并發(fā)編程系列的文章。 早期的計(jì)算機(jī)不包含操作系統(tǒng),它們從頭到尾執(zhí)行一個(gè)程序,這個(gè)程序可以訪問計(jì)算機(jī)中的所有資源。在這種情況下,每次都只能運(yùn)行一個(gè)程序,對(duì)于昂貴的計(jì)算機(jī)資源來說是一種嚴(yán)重的浪費(fèi)。 操作系統(tǒng)出現(xiàn)后,計(jì)算機(jī)可以運(yùn)行多個(gè)程序,不同的程序在單獨(dú)...

    Elle 評(píng)論0 收藏0
  • 出場(chǎng)率比較高的一道線程安全面試題

    摘要:程序正常運(yùn)行,輸出了預(yù)期容量的大小這是正常運(yùn)行結(jié)果,未發(fā)生多線程安全問題,但這是不確定性的,不是每次都會(huì)達(dá)到正常預(yù)期的。另外,像等都有類似多線程安全問題,在多線程并發(fā)環(huán)境下避免使用這種集合。 這個(gè)問題是 Java 程序員面試經(jīng)常會(huì)遇到的吧。 工作一兩年的應(yīng)該都知道 ArrayList 是線程不安全的,要使用線程安全的就使用 Vector,這也是各種 Java 面試寶典里面所提及的,可能...

    xiyang 評(píng)論0 收藏0
  • 想進(jìn)大廠?50個(gè)線程面試題,你會(huì)少?(一)

    摘要:下面是線程相關(guān)的熱門面試題,你可以用它來好好準(zhǔn)備面試。線程安全問題都是由全局變量及靜態(tài)變量引起的。持有自旋鎖的線程在之前應(yīng)該釋放自旋鎖以便其它線程可以獲得自旋鎖。 最近看到網(wǎng)上流傳著,各種面試經(jīng)驗(yàn)及面試題,往往都是一大堆技術(shù)題目貼上去,而沒有答案。 不管你是新程序員還是老手,你一定在面試中遇到過有關(guān)線程的問題。Java語言一個(gè)重要的特點(diǎn)就是內(nèi)置了對(duì)并發(fā)的支持,讓Java大受企業(yè)和程序員...

    wow_worktile 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<