3.1等待/通知机制(wait/notify)
来源:互联网 发布:阿里云和百度云的区别 编辑:程序博客网 时间:2024/05/20 20:21
wait/notify
wait()之后锁立即释放和notify()之后锁不立即释放
针对上面的锁释放不释放,来做一个小的例子
先做wait()之后锁立即释放
package com.myObject;public class Object1 { public void mothd1(Object lock) { synchronized (lock) { try { System.out.println("wait begin"); lock.wait(); System.out.println("wait end"); } catch (InterruptedException e) { e.printStackTrace(); } } }}
package com.myThread;import com.myObject.Object1;public class Thread1a extends Thread { Object lock; Object1 object1 = new Object1(); public Thread1a(Object lock) { this.lock = lock; } @Override public void run() { object1.mothd1(lock); }}
package com.myThread;import com.myObject.Object1;public class Thread1b extends Thread { Object lock; Object1 object1 = new Object1(); public Thread1b(Object lock) { this.lock = lock; } @Override public void run() { object1.mothd1(lock); }}
package com.test;import com.myThread.Thread1a;import com.myThread.Thread1b;public class Test1 { public static void main(String[] args){ Object lock = new Object(); Thread1a thread1a = new Thread1a(lock); thread1a.start(); Thread1b thread1b = new Thread1b(lock); thread1b.start(); }}
打印结果
wait begin
wait begin
下面是验证notify()之后锁不立即释放
package com.myObject;public class Object1 { public void mothd1(Object lock) { synchronized (lock) { try { System.out.println(Thread.currentThread().getName()+" wait begin " + System.currentTimeMillis()); lock.wait(); System.out.println(Thread.currentThread().getName()+" wait end " + System.currentTimeMillis()); } catch (InterruptedException e) { e.printStackTrace(); } } } public void mothd2(Object lock) { synchronized (lock) { try { System.out.println(Thread.currentThread().getName()+"notify begin " + System.currentTimeMillis()); lock.notify(); Thread.sleep(5000);//延时用于测试是否有立即释放锁 System.out.println(Thread.currentThread().getName()+"notify end " + System.currentTimeMillis()); } catch (InterruptedException e) { e.printStackTrace(); } } }}
package com.myThread;import com.myObject.Object1;public class Thread1a extends Thread { Object lock; Object1 object1 = new Object1(); public Thread1a(Object lock) { this.lock = lock; } @Override public void run() { object1.mothd1(lock); }}
package com.myThread;import com.myObject.Object1;public class Thread1b extends Thread { Object lock; Object1 object1 = new Object1(); public Thread1b(Object lock) { this.lock = lock; } @Override public void run() { object1.mothd2(lock); }}
package com.test;import com.myThread.Thread1a;import com.myThread.Thread1b;public class Test1 { public static void main(String[] args) throws InterruptedException{ Object lock = new Object(); Thread1a thread1a = new Thread1a(lock); thread1a.setName("A"); thread1a.start(); Thread.sleep(1000); Thread1b thread1b = new Thread1b(lock); thread1b.setName("B"); thread1b.start(); }}
打印结果
A wait begin 1453090470087
Bnotify begin 1453090471088
Bnotify end 1453090476088
A wait end 1453090476088
说明notify必须在执行完synchronized同步方法或者同步代码块之后才释放锁
wait之后使用interrupt
package com.myObject;public class Object2 { public void mothd1(Object lock) { synchronized (lock) { try { System.out.println(Thread.currentThread().getName()+" wait begin " + System.currentTimeMillis()); lock.wait(); System.out.println(Thread.currentThread().getName()+" wait end " + System.currentTimeMillis()); } catch (InterruptedException e) { e.printStackTrace(); } } }}
package com.myThread;import com.myObject.Object2;public class Thread2 extends Thread { Object lock; Object2 object2 = new Object2(); public Thread2(Object lock) { this.lock = lock; } @Override public void run() { object2.mothd1(lock); }}
package com.test;import com.myThread.Thread2;public class Test2 { public static void main(String[] args) throws InterruptedException{ Object lock = new Object(); Thread2 thread2 = new Thread2(lock); thread2.setName("A"); thread2.start(); Thread.sleep(1000); thread2.interrupt(); }}
当线程处于wait()时,调用线程对象的interrupt()会出现InterruptedException
总结:释放锁的时刻有
1)同步代码完成
2)抛出异常或者return
3)wait()方法
0 0
- 3.1等待/通知机制(wait/notify)
- 等待/通知机制wait(),notify()
- 等待/通知机制:wait/notify
- 11_等待/通知(wait/notify)机制介绍
- 等待通知机制 wait,notify,notifyAll
- 等待(wait)和通知(notify)
- JAVA多线程-线程间通信(一)-等待/通知机制(wait/notify)
- No5.线程的等待(wait)和通知(notify)
- Wait/Notify通知机制解析
- 3.1等待和通知API(Wait-and-Notify API Tour)
- Java-线程$等待唤醒机制(wait,notify)
- Java多线程之线程间通信--等待(wait)/通知(notify)机制,等待/通知之交叉备份实例
- Java多线程编程3--线程间通信--等待(wait)/通知(notify)机制
- java中等待通知机制(wait/notify)
- Java线程等待wait通知notify方法的使用
- Java 同步(Synchronization),等待(wait)通知(notify, notifyall)
- [转]Wait-Notify机制
- Wait-Notify机制
- javascript 类,只读属性,闭包
- js 字符串 replace replaceAll
- Java学习笔记(60)----------8张图理解Java
- Objective-C @property学习总结3 完结
- 聊聊并发(八)——Fork/Join框架介绍
- 3.1等待/通知机制(wait/notify)
- java中方法的动态绑定
- word去掉页眉或页脚的横线
- 用sql脚本建立Mysql数据库及表
- 利用Javascript来创建Ubuntu Scope
- HTML disabled属性的启用和禁止
- 只在第n页插入页眉或页脚
- 人生也有涯,而知也无涯。
- hihocoder #1183 : 连通性一·割边与割点