java 线程通过对象的Wait和Notify进行同步,但是存在一定的危险性
其重点是:wait 和 notify 的 时间点
举例:
package com.horizon.thread.aqs; public class NotSafeWaitNotify { private static StringBuffer lock = new StringBuffer(); public static void main(String[] args) throws Exception { // testWaitAfterNotify(); //testWaitBeforeNotify(); testWaitAfterNotifyV2(); } /** * 先notify 后wait,不能正常工作 */ private static void testWaitAfterNotify() throws Exception { Thread modifyThread = new Thread() { @Override public void run() { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (lock) { lock.append("1000"); lock.notify(); } } }; modifyThread.start(); Thread.sleep(2000); synchronized (lock) { lock.wait(); } System.out.println(lock); } /** * 先notify 后wait,不能正常工作 * 改进思路:先判断是否已经有结果 */ private static void testWaitAfterNotifyV2() throws Exception { Thread modifyThread = new Thread() { @Override public void run() { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (lock) { lock.append("1000"); lock.notify(); } } }; modifyThread.start(); Thread.sleep(2000); synchronized (lock) { //先判断是否已经有结果 if (lock.length() < 0) { lock.wait(); } } System.out.println(lock); } /** * 先wait 后notify,正常工作 */ private static void testWaitBeforeNotify() throws Exception { Thread modifyThread = new Thread() { @Override public void run() { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (lock) { lock.append("1000"); lock.notify(); } } }; modifyThread.start(); synchronized (lock) { lock.wait(); } System.out.println(lock); } }
相关推荐
文章目录1 wait、notify、notifyAll简单介绍1.1 使用方法 + 为什么不是Thread类的方法1.2 什么时候加锁、什么时候释放锁?1.3 notify、notifyAll的区别2 两个比较经典的使用案例2.1 案例1 — ABCABC。。。三个线程...
1.这两个方法来自不同的类,sleep是Thread类的方法,而wait是Object类的方法; 2.执行sleep方法后不会释放锁,而执行wait方法后会释放锁; 3.wait,notify和notifyAll只能在同步方法或同步代码块中调用,而sleep可以...
*练习wait()和notify()方法 */ public class TestBank { public static void main(String[] args) { Account acc = new Account(“1234” , “1234” , 2000.0); Thread h = new Thread(new Husband(acc) , ...
no2_wait_notify wait-notify-notifyAll的实例 no3_thread_hangup 线程挂起的几种实现方式 no4_join join的实例 no5_thread_stop 停止线程的几种方法 no6_deadlock 模拟死锁 no7_threadlocal ThreadLocal...
为了实现同步,Java提供了synchronize关键字以及object的wait()/notify()机制,可是在简单易用的背后,应藏着更为复杂的玄机,很多问题就是由此而起。 一、Java内存模型 在了解Java的同步秘密之前,先来看看JMM...
sthread.notify(); }//synchronized }//play() public void stop(){ sthread.isplay=false; }//stop public void doit(File file){ this.init(file); if(sthread.isplay){ this.play(); synchronized...
所以不应该使用suspend(),而应在自己的Thread类中置入一个标志,指出线程应该活动还是挂起。若标志指出线程应该挂起,便用wait()命其进入等待状态。若标志指出线程应当恢复,则用一个notify()重新启动线程。
只有当别的线程在该对象上调用了 notify()或者notifyAll()方法,"Wait Set"队列中的线程才得到机会去竞争,但是只有一个线程获得对象的Monitor,恢复到运行态。"Wait Set"中的线程在Thread Dump中显示的状态为 in ...
wait set——线程的休息室 wait方法——把线程放入wait set notify方法——从wait set拿出线程 notifyAll方法——从wait set拿出所有线程 wait、notify、notifyAll是Object类的方法 线程的状态移转 跟线程有关的其他...
线程 轻量级跨平台线程/互斥体实现,包括 win32、win8、linux、...//wait-notify范式,3秒后会被main唤醒 printf("来自线程的你好:%llu\n",thread::current_thread_id()); l.unlock(); } int main(int argc,const
4、线程间的协调手段:lock、condition、wait、notify、notifyAll☆☆☆ 5、Lock-free: atomic、concurrentMap.putIfAbsent、CopyOnWriteArrayList☆☆☆ 6、关于锁使用的经验介绍 7、并发流程控制手段:...
LeetCode判断字符串是否循环 知识点总结 java基础 1、使用迭代器和for each循环查看集合元素时只能获得元素的值,不能改变元素 ...object的方法:wait(notify,notifyall),thread的方法:(sleep、join),结束
this.notify();//通知其它线程把数据出栈 Character charObj = new Character(c); buffer.addElement(charObj); contents=c; } public void print(char c) { // TODO 自动生成方法存根 } } class ControlEnter ...
读者将通过使用java.lang.thread类、synchronized和volatile关键字,以及wait、notify和notifyall方法,学习如何初始化、控制和协调并发操作。此外,本书还提供了有关并发编程的全方位的详细内容,例如限制和同步、...
读者将通过使用java.lang.thread类、synchronized和volatile关键字,以及wait、notify和notifyall方法,学习如何初始化、控制和协调并发操作。此外,本书还提供了有关并发编程的全方位的详细内容,例如限制和同步、...
wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。 62、同步和...
try{ Thread.sleep(10); }catch(Exception e){ System.out.println(e.getMessage()); } this.sex=sex; } public synchronized void get(){ System.out.println(name+...
笔记本的风扇控制 ---------------------------------------- 09 November 2006. Summary of changes for version 20061109: 1) ACPI CA Core Subsystem: Optimized the Load ASL operator in the case where the...