Java线程等待wait通知notify方法的使用

Java线程编程中,等待wait,通知notify方法的使用都必须在同步代码块,或同步方法中才能调用。这是一个前提。

        每个对象都有一个对象锁,当进入同步代码块时,上锁,从同步代码中离开时解锁。或者当调用该对象的wait方法时解锁。

wait方法和notify方法都是从Object类继承过来的,每个对象都有。

当某个对象调用wait方法,会导致该线程等待,直到另外的其他线程再用这个对象来调它的notify方法时,等待的地方才会重新启动。

notfiy方法就是通知已经使用该对象调用了wait方法的线程重新启动起来。

notifyAll也一样,只是notifyAll是唤醒所有等待的线程都启动起来,而notify是随机的唤醒某条在等待的。

如果上面几句话看懂了,估计也理解了,对象的通知、等待机制,就是用于处理不同线程间处理相同对象时的一种通信机制。对象锁就是当不同线程处理同一对象时,给个先来后到的机制,防止出现同一时刻点多条线程用同个对象处理发生冲突。

下面是一个简单易懂的例子,介绍怎么来用wait和notify方法.这里是假设用来测试悲观锁时候有效的这么一种场景

public class Test {
public static void main(String[] args) {
Object obj = new Object();


new Thread(){
@Override
public void run(){
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized(obj){
System.out.println("当前线程:"+Thread.currentThread().getName()+"假设开始执行悲观锁操作");
obj.notifyAll();//通知其他线程中已经调用了该对象的wait方法,导致线程等待的,重新启动起来。
}
}
}.start();

new Thread(){
@Override
public void run(){
synchronized(obj){
System.out.println("进入到同步代码块,当前线程:"+Thread.currentThread().getName());
try {
obj.wait();//调用了该对象的wait方法,导致当前线程等待,知道其他线程调用该对象的notify方法,才会重新启动
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程:"+Thread.currentThread().getName()+",假设执行查询操作,应该会出现等待悲观锁");
}
}
}.start();

new Thread(){
@Override
public void run(){
synchronized(obj){
System.out.println("进入到同步代码块,当前线程:"+Thread.currentThread().getName());
try {
obj.wait();//调用了该对象的wait方法,导致当前线程等待,知道其他线程调用该对象的notify方法,才会重新启动
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程:"+Thread.currentThread().getName()+",假设执行查询操作,应该会出现等待悲观锁");
}
}
}.start();
}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值