亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

1.什么是線程安全性

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

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

2.原子性

2.1 競爭條件

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

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

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

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

long count = 0;
count++;

2.2 復(fù)合操作

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

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

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

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

3.加鎖機制

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

3.1 內(nèi)置鎖

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

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

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

3.2 重入

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

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

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

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

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

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ù)分解計算
            lastNumber = i;
            lastFactors = factors;//存放上一次計算結(jié)果
            encodeIntoResponse(resp, factors);
        }
    }
}

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

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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MyBatis高級映射學(xué)習(xí)教程

    MyBatis高級映射學(xué)習(xí)教程

    這篇文章主要介紹了MyBatis高級映射學(xué)習(xí)教程的相關(guān)資料,需要的朋友可以參考下
    2016-05-05
  • Springboot錯誤處理機制實現(xiàn)原理解析

    Springboot錯誤處理機制實現(xiàn)原理解析

    這篇文章主要介紹了springboot錯誤處理機制實現(xiàn)原理解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04
  • Mybatis實現(xiàn)分頁查詢的詳細流程

    Mybatis實現(xiàn)分頁查詢的詳細流程

    這篇文章主要給大家介紹了關(guān)于Mybatis實現(xiàn)分頁查詢的詳細流程,MyBatis是支持普通SQL查詢,存儲過程和高級映射的優(yōu)秀持久層框架,需要的朋友可以參考下
    2023-08-08
  • 淺談java中OO的概念和設(shè)計原則(必看)

    淺談java中OO的概念和設(shè)計原則(必看)

    下面小編就為大家?guī)硪黄獪\談java中OO的概念和設(shè)計原則(必看)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • 解析SpringBoot項目開發(fā)之Gzip壓縮過程

    解析SpringBoot項目開發(fā)之Gzip壓縮過程

    這篇文章主要介紹了SpringBoot項目開發(fā)之Gzip壓縮過程,本文給大家分享幾種Gzip壓縮方式,通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • BeanUtils.copyProperties復(fù)制對象結(jié)果為空的原因分析

    BeanUtils.copyProperties復(fù)制對象結(jié)果為空的原因分析

    這篇文章主要介紹了BeanUtils.copyProperties復(fù)制對象結(jié)果為空的原因分析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Spring mvc工作原理_動力節(jié)點Java學(xué)院整理

    Spring mvc工作原理_動力節(jié)點Java學(xué)院整理

    這篇文章主要為大家詳細介紹了Spring mvc工作原理的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • 基于Rest的API解決方案(jersey與swagger集成)

    基于Rest的API解決方案(jersey與swagger集成)

    下面小編就為大家?guī)硪黄赗est的API解決方案(jersey與swagger集成)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • java進階之了解SpringBoot的配置原理

    java進階之了解SpringBoot的配置原理

    今天帶大家了解SpringBoot的相關(guān)知識,文中對SpringBoot的配置原理作了非常詳細的圖文示例及介紹,需要的朋友可以參考下
    2021-06-06
  • java使用OGEngine開發(fā)2048

    java使用OGEngine開發(fā)2048

    眾所周知OGEngine是國人對AndEngine改進后的國產(chǎn)Java編程的游戲引擎,除了支持3D游戲這個雞肋功能之外AndEngine的功能OGEngine都有,而且AndEngine缺少的多點觸摸功能也被國人完善了。今天我們就嘗試下使用OGEngine制作熱門游戲2048.
    2015-03-03

最新評論