概述
一、创建资源类,在资源类创建属性和操作方法。
二、在资源类操作方法
(1)判断
(2)运行
(3)通知
三、创建多个线程,调用资源类的操作方法
四、防止虚假唤醒问题等
notifyAll
public final void notifyAll()
唤醒正在等待对象监视器的所有线程。 线程通过调用wait方法之一等待对象的监视器。
唤醒的线程将无法继续,直到当前线程释放该对象上的锁。 唤醒的线程将以通常的方式与任何其他线程竞争,这些线程可能正在积极地竞争在该对象上进行同步; 例如,唤醒的线程在下一个锁定该对象的线程中不会有可靠的特权或缺点。
该方法只能由作为该对象的监视器的所有者的线程调用。 有关线程可以成为监视器所有者的方法的说明,请参阅notify方法。
异常
IllegalMonitorStateException - 如果当前线程不是此对象的监视器的所有者。
另请参见:
notify() , wait()
wait
public final void wait()
throws InterruptedException
导致当前线程等待,直到另一个线程调用该对象的notify()方法或notifyAll()方法。 换句话说,这个方法的行为就好像简单地执行呼叫wait(0) 。
当前的线程必须拥有该对象的显示器。 该线程释放此监视器的所有权,并等待另一个线程通知等待该对象监视器的线程通过调用notify方法或notifyAll方法notifyAll 。 然后线程等待,直到它可以重新获得监视器的所有权并恢复执行。
像在一个参数版本中,中断和虚假唤醒是可能的,并且该方法应该始终在循环中使用:
synchronized (obj) {
while (<condition does not hold>)
obj.wait();
... // Perform action appropriate to condition
}
该方法只能由作为该对象的监视器的所有者的线程调用。 有关线程可以成为监视器所有者的方式的说明,请参阅notify方法。
异常
IllegalMonitorStateException - 如果当前线程不是对象监视器的所有者。
InterruptedException - 如果任何线程在当前线程等待通知之前或当前线程中断当前线程。 当抛出此异常时,当前线程的中断状态将被清除。
另请参见:
notify() , notifyAll()
class Share{
private int number = 0;
public synchronized void incr() throws InterruptedException {
if (number !=0){
this.wait();
}
number++;
System.out.println(Thread.currentThread().getName()+"::"+number);
this.notifyAll();
}
public synchronized void decr() throws InterruptedException {
if (number !=1){
this.wait();
}
number--;
System.out.println(Thread.currentThread().getName()+"::"+number);
this.notifyAll();
}
}
public class MainThreadDemo {
public static void main(String[] args) {
Share share = new Share();
new Thread(()->{
for(int i =1;i<=10;i++){
try {
share.incr();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"AA").start();
new Thread(()->{
for(int i =1;i<=10;i++){
try {
share.decr();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"BB").start();
}
}
最后
以上就是老实身影为你收集整理的多线程通信实现(Synchronized)的全部内容,希望文章能够帮你解决多线程通信实现(Synchronized)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复