Java实现生产者和消费者的方法

生产者和消费者问题是线程模型中的经典问题:
生产者和消费者在同一时间段内共用同一个存储空间,生产者往存储空间中添加产品,消费者从存储空间中取走产品。
当存储空间为空时,消费者阻塞,当存储空间满时,生产者阻塞。

实现方法(部分)有:

1.使用wait()方法和notify()方法实现。这是最简单最基础的实现,缓冲区满和缓冲区为空时都调用wait()方法等待,当生产者生产了一个产品或者消费者消费了一个产品之后会唤醒所有线程。

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

3.阻塞队列BlockingQueue的实现。BlockingQueue即阻塞队列,从阻塞这个词可以看出,在某些情况下对阻塞队列的访问可能会造成阻塞。被阻塞的情况主要有如下两种:

3.1.当队列满了的时候进行入队列操作

3.2..当队列空了的时候进行出队列操作

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

发布了62 篇原创文章 · 获赞 34 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_42451835/article/details/104221278
今日推荐