ExecutorService + synchronized + 对象锁 实现生产者消费者模式

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

猜你喜欢

转载自blog.csdn.net/themagickeyjianan/article/details/107011612