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的强!