java实现生产者和消费者的三种方法

在设计实现该模式的时候,需要注意以下三个问题:

对容器取产品和添加产品时的同步问题,即任意时刻,取与添加是互斥的,且每一次取操作之间也是互斥的(添加操作也是如此)。

方法1:
使用wait()和notify(),当容器满了之后,生产者需要暂时停止生产,直到容器非满,当容器空了之后,消费者需要暂时停止消费,直到容器非空,缓冲区为满和为空时都调用wait()方法等待,直到生产者生产了一个产品或者消费者消费了一个产品之后才会唤醒所有线程。

方法2:
await()与signal()方法,即线程锁的方式。
可重入锁(ReentrantLock)的实现。
可重入锁,也叫做递归锁,指的是同一线程 外层函数获得锁之后 ,内层递归函数仍然有获取该锁的代码,但不受影响。
简单来说,该锁维护这一个与获取锁相关的计数器,如果拥有锁的某个线程再次得到锁,那么获取计数器就加1,函数调用结束计数器就减1,然后锁需要被释放两次才能获得真正释放。
已经获取锁的线程进入其他需要相同锁的同步代码块不会被阻塞。

方法3:
阻塞队列(BlockingQueue)的实现。
被阻塞的情况主要有如下两种:
1.当队列满了的时候进行入队列操作
2.当队列空了的时候进行出队列操作

当一个线程对已经满了的阻塞队列进行入队操作时会阻塞,除非有另外一个线程进行了出队操作,当一个线程对一个空的阻塞队列进行出队操作时也会阻塞,除非有另外一个线程进行了入队操作。 所以,阻塞队列是线程安全的。

发布了53 篇原创文章 · 获赞 5 · 访问量 435

猜你喜欢

转载自blog.csdn.net/qq_45287265/article/details/104991518