文章链接
java语言-并发和同步-wait()、notify()和notifyAll()
面5笔5wait/notify会带来哪些问题?
1.过早唤醒问题
等待线程W和通知线程N都为同步对象someObject锁线程,如果通知线程N3更新好了共享变量,调用notifyall通知唤醒所有someObject等待集的等待线程,但是等待线程W1、W2发现其保护条件并没有成立,这就使得该线程被唤醒之后仍然需要继续等待,这种等待线程在其所需的保护条件并未成立的情况下被唤醒的现象就被称为过早唤醒造成资源浪费。
2.信号丢失问题
3.欺骗性唤醒问题
4.上下文切换问题
首先,等待线程执行Object.wait ()至少会导致该线程对相应对象内部锁的两次申请与释放。通知线程在执行Object.notify() / notifyAll()时需要持有相应对象的内部锁,因此Object.notify()/ notifyAll()调用会导致一次锁的申请。而锁的申请与释放可能导致上下文切换。
其次,等待线程从被暂停到唤醒这个过程本身就会导致上下文切换。再次,被唤醒的等待线程在继续运行时需要再次申请相应对象的内部锁,此时等待线程可能需要和相应对象的人口集中的其他线程以及其他新来的活跃线程(即申请相应的内部锁且处于RUNNABLE 状态的钱程)争用相应的内部锁,而这又可能导致上下文切换。