併發背後的問題
什麼是併發
併發就是指程式同時處理多個任務的能力。
併發程式設計的根源在於對多工情況下對訪問資源的有效控制。
下面來編寫一個執行緒安全與執行緒不安全的例子。
1.執行緒不安全程式碼。
package com.example.demo.concurrent;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
public class DownloadsSample {
public static int users=100; //同時模擬的併發訪問使用者數量
public static int downTotal=50000; //使用者下載的真實總數
public static int count=0; //計算器
public static void main(String[] args) {
//排程器,JDK1.5後提供的concurrent包對於併發的支援
ExecutorService executorService=Executors.newCachedThreadPool();
//訊號量,用於模式併發的人數
final Semaphore semaphore=new Semaphore(users);
for (int i=0;i<downTotal;i++){
executorService.execute(()->{
//通過多執行緒模擬n個使用者併發訪問並下載
try {
semaphore.acquire(); //獲取許可
add();
semaphore.release(); //釋放許可
}catch (Exception e){
e.printStackTrace();
}
});
}
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
executorService.shutdown(); //關閉排程服務
System.out.println("下載總數:"+count);
}
//執行緒不安全
public static void add(){
count++;
}
}
2.執行緒安全程式碼。
package com.example.demo.concurrent;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
public class DownloadsSample {
public static int users=100; //同時模擬的併發訪問使用者數量
public static int downTotal=50000; //使用者下載的真實總數
public static int count=0; //計算器
public static void main(String[] args) {
//排程器,JDK1.5後提供的concurrent包對於併發的支援
ExecutorService executorService=Executors.newCachedThreadPool();
//訊號量,用於模式併發的人數
final Semaphore semaphore=new Semaphore(users);
for (int i=0;i<downTotal;i++){
executorService.execute(()->{
//通過多執行緒模擬n個使用者併發訪問並下載
try {
semaphore.acquire(); //獲取許可
add();
semaphore.release(); //釋放許可
}catch (Exception e){
e.printStackTrace();
}
});
}
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
executorService.shutdown(); //關閉排程服務
System.out.println("下載總數:"+count);
}
//執行緒安全
public synchronized static void add(){
count++;
}
}
相關文章
- 圓通問題頻發背後的“罪與罰”
- 解密詭異併發問題的幕後黑手:可見性問題解密
- 併發程式背後的故事以及併發當中的記憶體模型記憶體模型
- 群體免疫背後的棘手數學問題
- 併發問題處理方式
- Java之併發三問題Java
- Facebook當機背後,我們該如何及時發現DNS問題DNS
- mysql併發事務的常見問題MySql
- 併發請求的重複插入問題
- 高併發快取面臨的問題快取
- java併發程式設計 --併發問題的根源及主要解決方法Java程式設計
- mysql 高併發 select update 併發更新問題解決方案MySql
- 知物由學 | 你的網路安全問題背後的真正原因
- 併發問題的三大根源是什麼?
- 完成20個問題後不敢發問題了
- 併發技術5:死鎖問題
- 學妹問我,併發問題的根源到底是什麼?
- 2890萬元罰單的背後,是銀行的資料安全管理問題
- 誰在星期三的史詩般的Twitter駭客背後? —安全問題
- Redis為什麼能抗住10萬併發?揭秘效能優越的背後原因Redis
- 架構演進實踐:從0到4000高併發請求背後的努力!架構
- .NET WebSocket高併發通訊阻塞問題Web
- MySQL中SELECT+UPDATE併發更新問題MySql
- 用分散式鎖解決併發問題分散式
- HashMap多執行緒併發問題分析HashMap執行緒
- [分散式]高併發案例---庫存超發問題分散式
- 遠端觸發Jenkins的Pipeline任務的併發問題處理Jenkins
- 抽卡遊戲大熱的背後,概率的大小還是主要的問題嗎?遊戲
- 所謂“Metaverse”背後的四個命題Metaverse
- 使用lua+redis解決發多張券的併發問題Redis
- 使用go的併發性來解決Hilbert酒店問題Go
- PHP高併發商品秒殺問題的解決方案PHP
- MySQL事務的隔離級別與併發問題MySql
- [併發程式設計]-關於 CAS 的幾個問題程式設計
- 網際網路廣告背後是什麼(2):核心問題
- 隱匿在撲克牌桌背後的學問
- 崩潰的一天,西安一碼通崩潰背後的技術問題。
- 頭部IP帶動,遊戲行業“繁榮”背後的合規問題遊戲行業