线程间通信

1.定义:

多个线程在操作同一资源,但是操作的动作不同。

2.安全问题:

加了同步以后还不安全,应该想到同步的前提:必须要有两个或两个以上的线程;必须是多个线程使用同一个锁;必须保证同步中只能有一个线程在运行

3.等待唤醒机制

wait(); --- notify();notifyAll();

都使用在同步中,因为需要对持有的监视器()的线程操作。所以必须使用在同步中,因为只有同步才具有锁。

 *** notify()唤醒的是线程池中的第一个等待对象,所以它有可能会唤醒本方的线程

notifyAll() 全部唤醒

为什么操作线程的方法要定义在Object类中呢?

因为这些方法在操作线程时,都必须要标识他们所操作的线程持有的锁,只有同一个锁上的被等待线程才能被同一个锁上的notify唤醒。

等待和唤醒必须是同一个锁。

而锁可以是任意对象,所以可被任意对象调用的方法定义在Object类中。

4.生产者-消费者问题

多生产者-消费者的问题

notifyAll()会将线程全部唤醒,包括对方和本方。

JDK 5.0中提供了升级解决方案

synchronized替换成显式的Lock操作,Object中的wait(),notify(),

notifyAll()换成了Condition对象,该对象可通过Lock锁获取。

private Lock lock = new ReentrantLock();

private Condition con_pro = lock.newCondition();

java.util.concurrent.locks中的接口 Lock 、接口Condition

Lock实现提供了比同步代码块和同步方法可获得的更广泛的锁定操作。

lock()加锁 、 unlock()解锁

await(),signal(),signalAll()