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

【并發(fā)多線程】java并發(fā)中的Synchronized關(guān)鍵詞

這篇具有很好參考價(jià)值的文章主要介紹了【并發(fā)多線程】java并發(fā)中的Synchronized關(guān)鍵詞。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

如果在多線程的環(huán)境中,我們經(jīng)常會(huì)遇到資源競爭的情況,比如多個(gè)線程要去同時(shí)修改同一個(gè)共享變量,這時(shí)候,就需要對(duì)資源的訪問方法進(jìn)行一定的處理,保證同一時(shí)間只有一個(gè)線程訪問。

java提供了synchronized關(guān)鍵字,方便我們實(shí)現(xiàn)上述操作。

為什么要同步

我們舉個(gè)例子,我們創(chuàng)建一個(gè)類,提供了一個(gè)setSum的方法:

public class SynchronizedMethods {

    private int sum = 0;

    public void calculate() {
        setSum(getSum() + 1);
    }
}

如果我們?cè)诙嗑€程的環(huán)境中調(diào)用這個(gè)calculate方法:

@Test
public void givenMultiThread_whenNonSyncMethod() throws InterruptedException {
    ExecutorService service = Executors.newFixedThreadPool(3);
    SynchronizedMethods summation = new SynchronizedMethods();

    IntStream.range(0, 1000)
            .forEach(count -> service.submit(summation::calculate));
    service.shutdown();
    service.awaitTermination(1000, TimeUnit.MILLISECONDS);

    assertEquals(1000, summation.getSum());
}

按照上面的方法,我們預(yù)計(jì)要返回1000, 但是實(shí)際上基本不可能得到1000這個(gè)值,因?yàn)樵诙嗑€程環(huán)境中,對(duì)同一個(gè)資源進(jìn)行同時(shí)操作帶來的不利影響。

那我們?cè)趺床拍軌蚪ň€程安全的環(huán)境呢?

Synchronized關(guān)鍵詞

java提供了多種線程安全的方法,本文主要講解Synchronized關(guān)鍵詞,Synchronized關(guān)鍵詞可以有很多種形式:

  • Instance methods
  • Static methods
  • Code blocks

當(dāng)我們使用synchronized時(shí),java會(huì)在相應(yīng)的對(duì)象上加鎖,從而在同一個(gè)對(duì)象等待鎖的方法都必須順序執(zhí)行,從而保證了線程的安全。

Synchronized Instance Methods
Synchronized關(guān)鍵詞可以放在實(shí)例方法的前面:

   public synchronized void synchronisedCalculate() {
        setSum(getSum() + 1);
    }

看下調(diào)用結(jié)果:

@Test
public void givenMultiThread_whenMethodSync() {
    ExecutorService service = Executors.newFixedThreadPool(3);
    SynchronizedMethods method = new SynchronizedMethods();

    IntStream.range(0, 1000)
      .forEach(count -> service.submit(method::synchronisedCalculate));
    service.awaitTermination(1000, TimeUnit.MILLISECONDS);

    assertEquals(1000, method.getSum());
}

這里synchronized將會(huì)鎖住該方法的實(shí)例對(duì)象,多個(gè)線程中只有獲得該實(shí)例對(duì)象鎖的線程才能夠執(zhí)行。

Synchronized Static Methods
Synchronized關(guān)鍵詞也可以用在static方法前面:

public static synchronized void syncStaticCalculate() {
    staticSum = staticSum + 1;
}

Synchronized放在static方法前面和實(shí)例方法前面鎖住的對(duì)象不同。放在static方法前面鎖住的對(duì)象是這個(gè)Class本身,因?yàn)橐粋€(gè)Class在JVM中只會(huì)存在一個(gè),所以不管有多少該Class的實(shí)例,在同一時(shí)刻只會(huì)有一個(gè)線程可以執(zhí)行該放方法。

@Test
public void givenMultiThread_whenStaticSyncMethod() throws InterruptedException {
    ExecutorService service = Executors.newCachedThreadPool();

    IntStream.range(0, 1000)
            .forEach(count ->
                    service.submit(SynchronizedMethods::syncStaticCalculate));
    service.shutdown();
    service.awaitTermination(100, TimeUnit.MILLISECONDS);

    assertEquals(1000, SynchronizedMethods.staticSum);
}

Synchronized Blocks
有時(shí)候,我們可能不需要Synchronize整個(gè)方法,而是同步其中的一部分,這時(shí)候,我們可以使用Synchronized Blocks:

public void performSynchronizedTask() {
    synchronized (this) {
        setSum(getSum() + 1);
    }
}

我們看下怎么測試:

@Test
public void givenMultiThread_whenBlockSync() throws InterruptedException {
    ExecutorService service = Executors.newFixedThreadPool(3);
    SynchronizedMethods synchronizedBlocks = new SynchronizedMethods();

    IntStream.range(0, 1000)
            .forEach(count ->
                    service.submit(synchronizedBlocks::performSynchronizedTask));
    service.shutdown();
    service.awaitTermination(100, TimeUnit.MILLISECONDS);

    assertEquals(1000, synchronizedBlocks.getSum());
}

上面我們同步的是實(shí)例,如果在靜態(tài)方法中,我們也可以同步class:

public static void performStaticSyncTask(){
    synchronized (SynchronizedMethods.class) {
        staticSum = staticSum + 1;
    }
}

我們看下怎么測試:文章來源地址http://www.zghlxwxcb.cn/news/detail-412291.html

@Test
public void givenMultiThread_whenStaticSyncBlock() throws InterruptedException {
    ExecutorService service = Executors.newCachedThreadPool();

    IntStream.range(0, 1000)
            .forEach(count ->
                    service.submit(SynchronizedMethods::performStaticSyncTask));
    service.shutdown();
    service.awaitTermination(100, TimeUnit.MILLISECONDS);

    assertEquals(1000, SynchronizedMethods.staticSum);
}

到了這里,關(guān)于【并發(fā)多線程】java并發(fā)中的Synchronized關(guān)鍵詞的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 安全滲透測試中的一款免費(fèi)開源的超級(jí)關(guān)鍵詞URL采集工具

    安全滲透測試中的一款免費(fèi)開源的超級(jí)關(guān)鍵詞URL采集工具

    安全滲透測試中的一款免費(fèi)開源的超級(jí)URL采集工具。 #################### 免責(zé)聲明:工具本身并無好壞,希望大家以遵守《網(wǎng)絡(luò)安全法》相關(guān)法律為前提來使用該工具,支持研究學(xué)習(xí),切勿用于非法犯罪活動(dòng),對(duì)于惡意使用該工具造成的損失,和本人及開發(fā)者無關(guān)。 ####

    2024年02月03日
    瀏覽(23)
  • 關(guān)鍵詞組合工具-自動(dòng)關(guān)鍵詞挖掘組成關(guān)鍵詞軟件免費(fèi)

    關(guān)鍵詞組合工具-自動(dòng)關(guān)鍵詞挖掘組成關(guān)鍵詞軟件免費(fèi)

    組合工具,今天給大家分享一款免費(fèi)的挖掘工具。自動(dòng)挖掘流量,過濾無效。自動(dòng)組成,組成標(biāo)題。以及自動(dòng)采集文章。詳細(xì)參考圖片 不少的網(wǎng)站能在相關(guān)的搜索引擎呈現(xiàn)的話,組合工具普通都會(huì)被這個(gè)搜索引擎所收錄,不然也

    2023年04月08日
    瀏覽(28)
  • GPT關(guān)鍵詞挖掘,自動(dòng)關(guān)鍵詞文章生成

    GPT關(guān)鍵詞挖掘,自動(dòng)關(guān)鍵詞文章生成

    隨著互聯(lián)網(wǎng)的發(fā)展,內(nèi)容營銷已成為企業(yè)營銷策略中不可或缺的一環(huán)。有效的文章生成可以幫助企業(yè)吸引更多的潛在客戶,提高品牌曝光度和轉(zhuǎn)化率,從而實(shí)現(xiàn)營銷目標(biāo)。 文章生成是指根據(jù)特定的和主題,使用軟件工具自動(dòng)生成相關(guān)的文章內(nèi)容。與傳統(tǒng)的

    2024年02月01日
    瀏覽(22)
  • 實(shí)現(xiàn)同時(shí)查找多個(gè)關(guān)鍵詞——KeywordCrafter - 關(guān)鍵詞匠心

    實(shí)現(xiàn)同時(shí)查找多個(gè)關(guān)鍵詞——KeywordCrafter - 關(guān)鍵詞匠心

    具體功能:同時(shí)查找多個(gè),高亮加粗顯示,并顯示出現(xiàn)次數(shù)。 ??碎碎念:最近在寫文案的時(shí)候,總是要避免出現(xiàn)一個(gè)敏感詞匯,利用 (command+F) or (Ctr+F) 查找,只能一個(gè)一個(gè)單詞去查,很麻煩。???♂? 所以我寫了一個(gè)簡單的網(wǎng)頁,在文本框輸入一整篇文章,在

    2024年02月13日
    瀏覽(34)
  • 長尾關(guān)鍵詞挖掘軟件-免費(fèi)的百度搜索關(guān)鍵詞挖掘

    長尾關(guān)鍵詞挖掘軟件-免費(fèi)的百度搜索關(guān)鍵詞挖掘

    嗨,大家好!今天,我想和大家聊一聊長尾挖掘工具。作為一個(gè)在網(wǎng)絡(luò)世界里摸爬滾打多年的人,我對(duì)這個(gè)話題有著一些個(gè)人的感悟和見解,希望能與大家分享。 首先,讓我坦白一點(diǎn),長尾挖掘工具對(duì)于我來說真是救命稻草。在我剛開始做網(wǎng)站優(yōu)化和內(nèi)容創(chuàng)作的

    2024年02月09日
    瀏覽(36)
  • 關(guān)鍵詞生成器在線-在線免費(fèi)關(guān)鍵詞生成器

    關(guān)鍵詞生成器在線-在線免費(fèi)關(guān)鍵詞生成器

    生成,什么是生成,生成就是根據(jù)你輸入的一個(gè)生成成千上百的核心,圍繞著你輸入的核心詞來生成的,優(yōu)先生成大量用戶搜索的,今天就給大家分享一款免費(fèi)生成工具,生成的來源主要是用戶都在搜索的詞,相關(guān)搜索的

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

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

    2024年02月08日
    瀏覽(22)
  • 關(guān)鍵詞提取 | 基于Textrank算法的兩種關(guān)鍵詞提取

    關(guān)鍵詞提取 | 基于Textrank算法的兩種關(guān)鍵詞提取

    目錄 一、PageRank算法 二、TextRank算法 1. 抽?。╧eyword extraction) 2. 關(guān)鍵短語抽?。╧eyphrase extration) 3. 關(guān)鍵句抽取(sentence extraction) 三、TextRank算法實(shí)現(xiàn) 1. 基于Textrank4zh的TextRank算法實(shí)現(xiàn) 2. 基于jieba的TextRank算法實(shí)現(xiàn) 3.?基于SnowNLP的TextRank算法實(shí)現(xiàn) 四、PageRank算法與Text

    2024年04月14日
    瀏覽(45)
  • 網(wǎng)站SEO關(guān)鍵詞規(guī)劃時(shí)如何篩選出合適的關(guān)鍵詞?

    網(wǎng)站SEO關(guān)鍵詞規(guī)劃時(shí)如何篩選出合適的關(guān)鍵詞?

    在網(wǎng)站SEO優(yōu)化過程中,布局是一個(gè)至關(guān)重要的環(huán)節(jié)。首先,我們需要確定核心,然后通過各種策略和方法對(duì)進(jìn)行擴(kuò)展。完成擴(kuò)展后,接下來的任務(wù)就是對(duì)這些擴(kuò)展后的進(jìn)行篩選。那么,如何進(jìn)行有效的篩選呢?我們通常建議選擇那些具有

    2024年04月17日
    瀏覽(40)
  • Stable Diffusion 告別猜關(guān)鍵詞,LoRA適配關(guān)鍵詞自動(dòng)生成

    Stable Diffusion 告別猜關(guān)鍵詞,LoRA適配關(guān)鍵詞自動(dòng)生成

    有沒有想想過在SD繪圖的時(shí)候下載好的LoRA模型選擇之后不生效是為什么?或者說不知道怎么填寫? 這里介紹基于 Civitai 的LoRA 使用方法。 如果沒有安裝的小伙伴可以參考前面的文章先對(duì) Civitai 的模型管理進(jìn)行安裝和使用,確保你的SD主頁已經(jīng)出現(xiàn)了 Civitai 助手 選項(xiàng)卡。

    2024年02月09日
    瀏覽(22)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包