java concurrent 例子_[Java Concurrent] 并發訪問共享資源的簡單案例

EvenGenerator 是一個偶數生成器,每調用一個 next() 就會加 2 并返回疊加后結果。在本案例中,充當被共享的資源。

EvenChecker 實現了 Runnable 接口,可以啟動新的線程執行 run() 任務,用于檢測所指向的偶數生成器是否每次都返回偶數值。

EvenCheckerThreadDemo 用于演示多線程下的執行情況。

非線性安全版本

EvenGenerator, 偶數生成器,每調用一個 next() 就會加 2 并返回疊加后結果。

這里的 next() 方法并非線性安全,在多線程同時訪問時,可能會返回奇數。一個線程執行了第一個累加語句后,被調度器中斷,替換上下文,另一個進程開始執行 next() 方法,則會返回奇數。

public classEvenGenerator {private int count = 0;public intnext(){

count++;

count++;returncount;

}

}

EvenChecker 檢測指向的 EvenGenerator 是不是每次都返回偶數。

public class EvenChecker implementsRunnable {privateEvenGenerator eg;private final int id = count++;private static int count = 0;

@Overridepublic voidrun() {while (true){int res =eg.next();if (res % 2 != 0){

System.out.println("not even" + res + " | Thread # " +id);break;

}

}

}publicEvenChecker(EvenGenerator eg){this.eg =eg;

}

}

演示多線程下的執行情況,多個線程同時執行 EvenChecker ,但是引用的是同一個 EvenGenerator

importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;public classEvenCheckerThreadDemo {public static voidmain(){

ExecutorService exec=Executors.newCachedThreadPool();

EvenGenerator eg= newEvenGenerator();for (int i = 0; i< 5 ; i++){

exec.execute(newEvenChecker(eg));

}

}

}

線性安全版本1

使用 synchronized 關鍵詞,使得 next() 方法線程安全,確保同一時間內,最多只有一個線程進入該方法。

public classEvenGenerator {private int count = 0;public synchronized intnext(){

count++;

count++;returncount;

}

}

線性安全版本2

使用 Lock 把訪問、修改共享變量的語句進行同步,確保同一時間內,最多只有一個線程進入該塊代碼。使用 try-finally 結構,可以確保 Lock 一定被釋放。

importjava.util.concurrent.locks.Lock;importjava.util.concurrent.locks.ReentrantLock;public classEvenGenerator {private int count = 0;private Lock lock = newReentrantLock();public intnext(){

lock.lock();try{

count++;

count++;returncount;

}finally{

lock.unlock();

}

}

}

參考資料

Page 827, Resolving shared resource contention, Thinking in Java

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/372764.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372764.shtml
英文地址,請注明出處:http://en.pswp.cn/news/372764.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

OSGI實戰第一章

第一章 解開OSGI的面紗 OSGI是什么&#xff1f;是Java平臺的一個模塊化層。模塊化&#xff1a;軟件應用程序的代碼被分割為表示獨立內容的邏輯單元&#xff0c;可簡化開發&#xff0c;可通過強化邏輯模塊的界限來提高可維護性。Java模塊化的不足a) Java使用訪問…

輕松完成Birt報告

這是使用Birt插件在Eclipse中構建報告的完整指南。 Birt或Business Intelligence and Reporting工具是一種無需編寫太多Java代碼即可生成報告的工具。 如果您使用的是ireport&#xff0c;那么您知道我在說什么&#xff1a;&#xff09;&#xff08;晶體報告..毫無意義&#xff…

MySQL 的 RowNum 實現

MySQL 下面沒有RowNum&#xff0c;排序后序號卻無法得到&#xff0c;比較麻煩&#xff01; SELECT rownum:rownum1 rownum, CollectSn From(SELECT rownum:0,bbgmain.* FROM qbdb.bbgmain WHERE collectsn! ORDER BY collectsn limit 10) t轉載于:https://www.cnblogs.com/hym-…

java jdbc事務管理_hibernate事務管理 (jdbc jta)

評論# re: hibernate事務管理 (jdbc jta)2007-07-29 10:18pigJTA事務的開始Transaction tx session.beginTransaction();應該不是這樣吧&#xff0c;應該是從容器中獲得。 回復 更多評論# re: hibernate事務管理 (jdbc jta)2007-07-29 12:35slxpig建議看看hibernate referen…

@Resource VS @Autowired

Resource 和 Autowired 均是用于bean注入的注解&#xff0c;都可以寫在字段和setter方法上,如果都寫在字段上&#xff0c;就無需寫setter方法。 Autowired 由Spring的org.springframework.beans.factory.annotation.Autowired提供 默認byType方式注入&#xff0c;并且對象不能為…

用于Spring應用程序的Gradle原型

我發布了Gradle原型&#xff0c;可用于基于Springframework創建Java / Groovy應用程序。 當然&#xff0c;它不是一個真正的原型&#xff0c;因為這樣的創作是不可能的 。不過&#xff0c;你可以創建&#xff0c;編輯和部署應用服務器很少的步驟。 對于可部署的軟件項目而言&am…

java tm無響應_Java(TM) Platform SE binary 未響應 是怎么個情況?

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓988098 [Thread-10] INFO sound.oo0O - Creating streaming player for music with id [faction_pirate_encounter_02_hostile.ogg]988099 [Thread-10] INFO sound.OooO - Playing music with id [faction_pirate_encounter_02_hos…

ROS and PCL install

ROS hydro安裝指南&#xff1a; http://wiki.ros.org/cn/hydro/Installation/Ubuntu &#xff08;加ppa源后直接安裝&#xff09; Linux OpenCV安裝指南&#xff1a;http://blog.sciencenet.cn/blog-571755-694742.html &#xff08;從源代碼編譯&#xff09; PCL&#xff1a;…

揭開Python科學計算的面紗

春牛春杖。無限春風來海上。便與春工。染得桃紅似肉紅。 春幡春勝。一陣春風吹酒醒。不似天涯。卷起楊花似雪花。 標準的Python中用列表保存一組值&#xff0c;可以當做數組使用&#xff0c;但是由于其值類型任意&#xff0c;所以列表中保存的是指針&#xff0c;這樣的話保存一…

FXML:使用BuilderFactory的自定義組件

當您想使用FXML時&#xff0c;您將需要能夠添加自己的組件。 這很容易&#xff0c;您只需要添加一個import語句。 FXML文件中以大寫字母開頭的元素將被解釋為實例&#xff0c;如果它們是Java Bean&#xff0c;則最重要&#xff1a;如果它們具有無參數的標準構造函數&#xff0c…

Excel 一鍵上傳到數據庫

<a class"edit" id"batchImport"> 批量導入 </a> js代碼彈窗&#xff1a; $("#batchImport").click(function(){ //彈窗彈窗下列內容 var html<form id"execlForm" method"post" enctype&quo…

SQL——實例記錄(對查詢結果排行號)

select 訂單編號, DENSE_RANK() over(order by 訂單編號) from test 排序結果&#xff1a; 55678-0-1 1 55678-0-1 1 33454-0-1 2 33454-0-1 2 33454-0-1 2 這種是按照訂單不同的順序依次往后排 當然也可以在 over后面加上你想要的起始號 例&#xff1a;DE…

TeamCity構建依賴項

介紹 構建依存關系的主題既不重要也不是次要的。 各種構建工具從不同的角度處理此主題&#xff0c;從而提供各種解決方案&#xff0c;每種解決方案都有其優點和缺點。 熟悉發行版和快照依賴項的Maven和Gradle用戶可能不了解TeamCity快照依賴項&#xff0c;或者認為他們與Maven…

復選框操作checked選中為true,反之為False,也可以賦值為true,false

轉載于:https://www.cnblogs.com/shiluoliming/p/6518236.html

java 個稅計算_【JAVA300例】10、計算個人所得稅

邏輯是這樣的。每個等級計算的系數都不一樣。分別有多個檔位。要判斷處于什么檔位然后用特殊的公式去計算。原版是從小到大判斷&#xff0c;每次寫條件很煩。這里換成從大到小。節省敲代碼時間。import java.util.Scanner;public class Test010{public static void main(String…

Java是否越來越接受靜態導入?

曾經有一段時間&#xff0c;至少在禮貌的社會中&#xff0c;人們普遍認為使用“ 不是 ”一詞是不可接受的。 確實&#xff0c;那時&#xff08;也許直到今天&#xff09;&#xff0c;許多人確實&#xff08;也確實&#xff09;認為不是一個真實的詞。 盡管這個詞并沒有 引起爭議…

Stream 工具方法

inputstream 轉 string 1、使用字符流 InputStream is TestZhimaCustomerCertificationInitialize.class.getClassLoader().getResourceAsStream("config/rsa_private_key_pkcs8.pem"); InputStreamReader isr new InputStreamReader(is); BufferedReader br new…

從0開始學習 GitHub 系列匯總筆記

本文學習自Stromzhang, 原文地址請移步&#xff1a;從0開始學習 GitHub 系列匯總 我的筆記&#xff1a; 0x00 從0開始學習GitHub 系列之[初識GitHub] GitHub 影響力 a.全球頂級科技公司紛紛加入 GitHub &#xff0c;并貢獻他們自己的項目代碼 Google: https://github.com/goog…

Drools Guvnor –管理訪問

外部化業務或技術規則對于可伸縮應用程序非常重要&#xff0c;但是應該管理BRMS服務訪問。 guvnor使用基于角色的授權提供控件UI訪問和操作。 在drools-guvnor參考手冊中列出了幾種權限類型。 具有所有權限的管理員。 分析師或只讀分析師&#xff1a;特定類別的分析師權限。 軟…

java文件操作和_JAVA文件操作類和文件夾的操作

JAVA文件操作類和文件夾的操作package com.gamvan.tools;import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.FileWriter;import java.io.IOException;import java.io.InputStream;import jav…