package Demo06_Productor_Consumer;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
class Room {
public int count = 0;
}
public class Main {
public static Room r = new Room();
public static int N = 100000;
public static ExecutorService executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * 5);
public static void main(String[] args) {
// 生產者1
executorService.submit(new Runnable() {
@Override
public void run() {
try {
for (int i = 0; i < N; i++) {
synchronized (r) {
r.count++;
}
}
} catch (Exception e) {
}
System.out.println("addEnd");
}
});
// 生產者2
executorService.submit(new Runnable() {
@Override
public void run() {
for (int i = 0; i < N; i++) {
synchronized (r) {
r.count++;
}
}
System.out.println("addEnd");
}
});
// 消費者1
executorService.submit(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 2 * N; i++) {
synchronized (r) {
r.count--;
}
}
System.out.println("subEnd");
}
});
// 1s後檢查結果
executorService.submit(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("final count=" + r.count);
}
});
// 關閉線程池
executorService.shutdown();
}
}
/*
addEnd
addEnd
subEnd
final count=0
*/
思考:
考慮到結合netty做業務,最終每一個請求都會被包裝爲task扔到線程池計算,
以房間類遊戲爲例子,每個人的請求最終要映射到具體操作哪一個房間對象,所以這個demo構建以Room作爲互斥對象,
然後每個人都進行操作,最終發現通過 synchronized 輕鬆寫出邏輯正確線程安全,可讀性強的代碼,這點可讀性感覺比go的強!