1.使用wait和notify。这是最简单最基础的实现,缓冲区满和为空时都调用wait()方法等待,当生产者生产了一个产品或者消费者消费了一个产品以后会唤醒全部线程。安全
2.可重入锁ReentrantLock的实现。可重入锁,也叫作递归锁,指的是同一线程 外层函数得到锁以后 ,内层递归函数仍然有获取该锁的代码,但不受影响,简单来讲,该锁维护这一个与获取锁相关的计数器,若是拥有锁的某个线程再次获得锁,那么获取计数器就加1,函数调用结束计数器就减1,而后锁须要被释放两次才能得到真正释放。已经获取锁的线程进入其余须要相同锁的同步代码块不会被阻塞。函数
3.阻塞队列BlockingQueue的实现。BlockingQueue即阻塞队列,从阻塞这个词能够看出,在某些状况下对阻塞队列的访问可能会形成阻塞。被阻塞的状况主要有以下两种:线程
3.1.当队列满了的时候进行入队列操做递归
3.2..当队列空了的时候进行出队列操做 所以,当一个线程对已经满了的阻塞队列进行入队操做时会阻塞,除非有另一个线程进行了出队操做,当一个线程对一个空的阻塞队列进行出队操做时也会阻塞,除非有另一个线程进行了入队操做。 从上可知,阻塞队列是线程安全的。队列