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

Java并發(fā)編程之線程安全性

 更新時(shí)間:2022年04月07日 14:31:46   作者:萬(wàn)貓學(xué)社  
這篇文章主要介紹了Java并發(fā)編程之線程安全性,文章基于Java的相關(guān)內(nèi)容詳細(xì)的展開詳細(xì)介紹,需要的小伙伴可以參考一下

1.什么是線程安全性

當(dāng)多個(gè)線程訪問某個(gè)類時(shí),不管運(yùn)行時(shí)環(huán)境采用何種調(diào)用方式或者這些線程將如何交替執(zhí)行,并且在主調(diào)代碼中不需要任何額外的同步或協(xié)同,這個(gè)類都能表現(xiàn)出正確的行為,那么就稱這個(gè)類是線程安全的。

無(wú)狀態(tài)的對(duì)象一定是線程安全的,比如:Servlet。

2.原子性

2.1 競(jìng)爭(zhēng)條件

由于不恰當(dāng)?shù)膱?zhí)行時(shí)序而出現(xiàn)不正確的結(jié)果的情況,就是競(jìng)爭(zhēng)條件。

“先檢查后執(zhí)行”操作,即通過一個(gè)可能實(shí)效的觀測(cè)結(jié)果來(lái)決定下一步的動(dòng)作。比如:延遲初始化。

if(instance == null) {
    instance = new SomeObject();
}

“讀取-修改-寫入”的操作,其結(jié)果狀態(tài)依賴于之前的狀態(tài)。如:遞增運(yùn)算。

long count = 0;
count++;

2.2 復(fù)合操作

原子操作是指,對(duì)于訪問同一個(gè)狀態(tài)的所有操作(包括此操作本身)來(lái)說(shuō),這個(gè)操作是以一個(gè)原子方式執(zhí)行(不可分割)的操作。

為了確保線程安全性,包含了一組必須以原子方式執(zhí)行的操作,稱為復(fù)合操作。

遞增運(yùn)算可以使用一個(gè)現(xiàn)有的線程安全類,確保線程安全性。如:

AtomicLong count = new AtomicLong(0);
count.incrementAndGet();

3.加鎖機(jī)制

當(dāng)類只有一個(gè)狀態(tài)變量時(shí),可以通過線程安全的狀態(tài)變量來(lái)維護(hù)類的線程安全性。但如果類有更多的狀態(tài)時(shí),就不能只添加更多線程安全的狀態(tài)變量了。要保持狀態(tài)的一致性,就需要在單個(gè)原子操作中更新所以相關(guān)的狀態(tài)變量。

3.1 內(nèi)置鎖

Java提供一種內(nèi)置鎖:同步代碼塊,它包括:一個(gè)作為鎖的對(duì)象引用、一個(gè)作為由這個(gè)鎖保護(hù)的代碼塊。

以關(guān)鍵字synchronized來(lái)修飾的方法就是一種橫跨整個(gè)方法體的同步代碼塊,其中該同步代碼塊的鎖就是方法調(diào)用所在的對(duì)象。靜態(tài)的synchronized方法以Class對(duì)象作為鎖。

線程在進(jìn)入同步代碼塊之前會(huì)自動(dòng)獲得鎖,在退出同步代碼塊是自動(dòng)釋放鎖。最多只有一個(gè)線程能持有這種鎖,因此同步代碼會(huì)以原子方式執(zhí)行。

3.2 重入

內(nèi)置鎖是可重入的,意味著獲取鎖的操作的粒度是線程,不是調(diào)用。當(dāng)某個(gè)線程試圖獲得一個(gè)已經(jīng)由它自己持有的鎖時(shí),這個(gè)請(qǐng)求也會(huì)成功。

重入進(jìn)一步提升了加鎖行為的封裝性,簡(jiǎn)化了面向?qū)ο蟛l(fā)代碼的開發(fā)。

public class Widget {
    public synchronized void doSomething() {
        //......
    }
}
public class LoggingWidget extends Widget {
    public synchronized void doSomething() {
        //......
        super.doSomething();//假如沒有可重入的鎖,該語(yǔ)句將產(chǎn)生死鎖。
    }
}

4.用鎖保護(hù)狀態(tài)

對(duì)于可能被多個(gè)線程同時(shí)訪問的可變狀態(tài)變量,在訪問它時(shí)都需要持有同一個(gè)鎖,在這種情況下,稱狀態(tài)變量是由這個(gè)鎖保護(hù)的。

5.活躍性與性能

粗粒度地使用鎖,雖然確保了線程安全性,但可能造成性能問題和活躍度問題,如:

@ThreadSafe
public class SynchronizedFactorizer implements Servlet {
    @GuardedBy("this") private BigInteger lastNumber;
    @GuardedBy("this") private BigInteger[] lastFactors;

    public synchronized void service(ServletRequest req,
                                     ServletResponse resp) {
        BigInteger i = extractFromRequest(req);
        if (i.equals(lastNumber))
            encodeIntoResponse(resp, lastFactors);
        else {
            BigInteger[] factors = factor(i);//因數(shù)分解計(jì)算
            lastNumber = i;
            lastFactors = factors;//存放上一次計(jì)算結(jié)果
            encodeIntoResponse(resp, factors);
        }
    }
}

可以通過縮小同步代碼塊,既確保servlet的并發(fā)型,又維護(hù)線程安全性。不要把本應(yīng)是原子操作拆分到多個(gè)同步代碼塊中,盡量將不影響共享狀態(tài)且執(zhí)行時(shí)間較長(zhǎng)的操作從同步代碼中分離出來(lái)。如:

public class CachedFactorizer implements Servlet {
    @GuardedBy("this") private BigInteger lastNumber;
    @GuardedBy("this") private BigInteger[] lastFactors;

    public void service(ServletRequest req, ServletResponse resp) {
        BigInteger i = extractFromRequest(req); 
        BigInteger[] factors = null;      
        synchronized (this) {
            if (i.equals(lastNumber)) {
               factors = lastFactors.clone();
            }         
        }    
        if (factors == null) {        
            factors = factor(i);
            synchronized (this) {
               lastNumber = i;
               lastFactors = factors.clone();
            }
        }
        encodeIntoResponse(resp, factors);
    }
}

到此這篇關(guān)于Java并發(fā)編程之線程安全性的文章就介紹到這了,更多相關(guān)Java 線程安全性內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • @Scheduled fixedDelayString 加載properties配置方式

    @Scheduled fixedDelayString 加載properties配置方式

    這篇文章主要介紹了@Scheduled fixedDelayString 加載properties配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • java?long?類型數(shù)據(jù)的賦值方式

    java?long?類型數(shù)據(jù)的賦值方式

    這篇文章主要介紹了java?long?類型數(shù)據(jù)的賦值方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Spring使用IOC與DI實(shí)現(xiàn)完全注解開發(fā)

    Spring使用IOC與DI實(shí)現(xiàn)完全注解開發(fā)

    IOC也是Spring的核心之一了,之前學(xué)的時(shí)候是采用xml配置文件的方式去實(shí)現(xiàn)的,后來(lái)其中也多少穿插了幾個(gè)注解,但是沒有說(shuō)完全采用注解實(shí)現(xiàn)。那么這篇文章就和大家分享一下,全部采用注解來(lái)實(shí)現(xiàn)IOC + DI
    2022-09-09
  • java常用的加密解決方案分享

    java常用的加密解決方案分享

    這篇文章全面介紹了Java中加解密技術(shù)的應(yīng)用,包括哈希函數(shù)、對(duì)稱加密、非對(duì)稱加密、消息認(rèn)證碼和數(shù)字簽名等,它詳細(xì)解釋了每種技術(shù)的工作原理,并提供了相應(yīng)的Java代碼示例,文章還強(qiáng)調(diào)了密鑰管理的重要性,并提出了在實(shí)際應(yīng)用中遵循的最佳實(shí)踐
    2025-01-01
  • java集合模擬實(shí)現(xiàn)斗地主洗牌和發(fā)牌

    java集合模擬實(shí)現(xiàn)斗地主洗牌和發(fā)牌

    這篇文章主要為大家詳細(xì)介紹了java集合模擬實(shí)現(xiàn)斗地主洗牌和發(fā)牌,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Spring在多線程環(huán)境下如何確保事務(wù)一致性問題詳解

    Spring在多線程環(huán)境下如何確保事務(wù)一致性問題詳解

    這篇文章主要介紹了Spring在多線程環(huán)境下如何確保事務(wù)一致性問題詳解,說(shuō)到異步執(zhí)行,很多小伙伴首先想到Spring中提供的@Async注解,但是Spring提供的異步執(zhí)行任務(wù)能力并不足以解決我們當(dāng)前的需求,需要的朋友可以參考下
    2023-11-11
  • 使用Spring Security集成手機(jī)驗(yàn)證碼登錄功能實(shí)現(xiàn)

    使用Spring Security集成手機(jī)驗(yàn)證碼登錄功能實(shí)現(xiàn)

    本文詳細(xì)介紹了如何利用SpringSecurity來(lái)實(shí)現(xiàn)手機(jī)驗(yàn)證碼的注冊(cè)和登錄功能,在登錄過程中,同樣需通過驗(yàn)證碼進(jìn)行驗(yàn)證,文章還提供了相關(guān)的代碼實(shí)現(xiàn)
    2024-10-10
  • Java中遞歸、循環(huán)的優(yōu)劣分析

    Java中遞歸、循環(huán)的優(yōu)劣分析

    這篇文章主要給大家介紹了關(guān)于Java中遞歸、循環(huán)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • SpringBoot使用注解進(jìn)行分頁(yè)的實(shí)現(xiàn)示例

    SpringBoot使用注解進(jìn)行分頁(yè)的實(shí)現(xiàn)示例

    分頁(yè)使用可以說(shuō)非常普遍了,有時(shí)候會(huì)需要非常靈活的方式去開啟或關(guān)閉分頁(yè),嘗試使用一下注解的方式來(lái)進(jìn)行分頁(yè),本文主要介紹了SpringBoot使用注解進(jìn)行分頁(yè)的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Zookeeper中如何解決zookeeper.out文件輸出位置問題

    Zookeeper中如何解決zookeeper.out文件輸出位置問題

    這篇文章主要介紹了Zookeeper中如何解決zookeeper.out文件輸出位置問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04

最新評(píng)論

深水埗区| 马关县| 大悟县| 巴林左旗| 资中县| 荥经县| 白朗县| 吉木乃县| 苗栗县| 巴楚县| 宁陕县| 合作市| 敦煌市| 张掖市| 呈贡县| 淮滨县| 黑山县| 吉隆县| 马山县| 松江区| 景洪市| 商丘市| 芷江| 谢通门县| 泰州市| 会理县| 凤城市| 南宁市| 孟州市| 合阳县| 东丰县| 理塘县| 抚松县| 博爱县| 六盘水市| 调兵山市| 中牟县| 广东省| 南城县| 兰州市| 乌鲁木齐市|