- 浏览: 6310728 次
- 性别:
- 来自: 一片神奇的土地
文章分类
- 全部博客 (745)
- JQuery (25)
- JS (33)
- 数据库 (59)
- Java基础 (56)
- JSON (8)
- XML (8)
- ireport (7)
- 设计模式 (10)
- 心情 (14)
- freemarker (1)
- 问题 (15)
- powerdesigner (2)
- CSS (15)
- DWR (4)
- tomcat (16)
- Hibernate (12)
- Oracle (7)
- Struts (7)
- Spring (34)
- JSP (23)
- 需学习 (64)
- 工具类库 (63)
- Maven (14)
- 笔试题 (34)
- 源码学习 (31)
- 多线程 (39)
- Android (32)
- 缓存 (20)
- SpringMVC (14)
- jQueryEasyUi (12)
- webservice-RPC (13)
- ant (1)
- ASP.NET (10)
- 正则表达式 (3)
- Linux (15)
- JBoss (1)
- EJB (3)
- UML (2)
- JMS (3)
- Flex (8)
- JSTL (2)
- 批处理 (5)
- JVM (16)
- 【工具】 (16)
- 数据结构 (29)
- HTTP/TCP/Socket (18)
- 微信 (1)
- tomcat源码学习 (15)
- Python (30)
- 主机 (2)
- 设计与架构 (19)
- thrift-RPC (2)
- nginx (6)
- 微信小程序 (0)
- 分布式+集群 (12)
- IO (1)
- 消息队列 (4)
- 存储过程 (8)
- redis (9)
- zookeeper (5)
- 海量数据 (5)
最新评论
-
360pluse:
技术更新,战术升级!Python爬虫案例实战从零开始一站通网盘 ...
Python爬虫实战:Scrapy豆瓣电影爬取 -
18335864773:
推荐用 pageoffice 组件生成 word 文件。
JAVA生成WORD工具类 -
jjhe369:
LISTD_ONE 写道起始地址为163.135.0.1 结束 ...
IP地址与CIDR -
baojunhu99:
private final int POOL_SIZE = 5 ...
使用CompletionService获取多线程返回值 -
LovingBaby:
胡说,javascript 运行时是单线程的,event lo ...
Ajax请求是否可以实现同步
1、
public class Demo6 { public static void main(String[] args) { Go1 q = new Go1(); Go2 qq = new Go2(q); Go3 qqq = new Go3(q); Come w = new Come(q); q.start(); qq.start(); qqq.start(); w.start(); } } // 线程1,打印1,等待,唤醒后打印一 class Go1 extends Thread { public void run() { synchronized (this) { System.out.println("1"); try { wait(); } catch (Exception e) { } } System.out.println("一"); } } // 线程2,打印2,等待,唤醒后打印二 class Go2 extends Thread { Go1 g; Go2(Go1 g) { this.g = g; } public void run() { synchronized (g) { System.out.println("2"); try { g.wait(); } catch (Exception e) { } } System.out.println("二"); } } // 线程3,打印3,等待,唤醒后打印三 class Go3 extends Thread { Go1 g; Go3(Go1 g) { this.g = g; } public void run() { synchronized (g) { System.out.println("3"); try { g.wait(); } catch (Exception e) { } } System.out.println("三"); } } // 唤醒线程 class Come extends Thread { Go1 r; Come(Go1 r) { this.r = r; } public void run() { try { sleep(100); } catch (Exception e) { } synchronized (r) { r.notify(); System.out.println("lock open"); } } }
结果:
1
2
3
lock open
一
三
二
答案:
原因是共用的对象本身也是一个线程,所以notify的时候,如果被唤醒的是Go1的线程,那么Go2和Go3中的g.wait();也会跟着返回,所以相当于Go1,Go2,Go3都被唤醒,然后一起争夺锁。把共用的对象换成一个普通的对象就没有问题了。代码如下:
public class Demo7 { public static void main(String[] args) { Go g = new Go(); Go1 q = new Go1(g); Go2 qq = new Go2(g); Go3 qqq = new Go3(g); Come w = new Come(g); q.start(); qq.start(); qqq.start(); w.start(); } } class Go { } class Go1 extends Thread { Go g; Go1(Go g) { this.g = g; } public void run() { synchronized (g) { System.out.println("1"); try { g.wait(); } catch (Exception e) { } } System.out.println("一"); } } class Go2 extends Thread { Go g; Go2(Go g) { this.g = g; } public void run() { synchronized (g) { System.out.println("2"); try { g.wait(); } catch (Exception e) { } } System.out.println("二"); } } class Go3 extends Thread { Go g; Go3(Go g) { this.g = g; } public void run() { synchronized (g) { System.out.println("3"); try { g.wait(); } catch (Exception e) { } } System.out.println("三"); } } class Come extends Thread { Go r; Come(Go r) { this.r = r; } public void run() { try { sleep(100); } catch (Exception e) { } synchronized (r) { r.notify(); System.out.println("lock open"); } } }
结果:
1
2
3
lock open
一
来源:javaeye问答
http://www.iteye.com/problems/89570
发表评论
-
AQS
2019-03-21 15:08 2033大白话聊聊Java并发面试问题之谈谈你对AQS的理解? ... -
JAVA内存模型-(程锁V传+启断终结)
2018-04-25 11:29 979Java并发编程:volatile关键字解析-(重要,分析 ... -
ArrayBlockingQueue
2018-04-18 15:54 1262ArrayBlockingQueue p ... -
【多线程总结】
2017-12-12 15:53 645线程需要注意的地方: 1、 public final s ... -
服务器集群对Synchronized有没有什么影响
2015-11-11 15:39 5398有个功能大致如下,在一堆没用过的数据中取一条数据,并将其标 ... -
获取id 的一种策略
2015-07-07 17:48 1935从数据库中批量(step个)拿出Id,然后使用,待消耗完后 ... -
模拟的线程池
2014-09-25 09:51 1746自定义数据库连接池 例子: public cla ... -
Thread例子
2014-09-24 17:53 5830看看对Thread到底懂多少,嘿嘿 Exampl ... -
FairSync与NonfairSync
2014-09-24 16:50 6633state 为0,表示锁未被获取 不为0,表示已被获取 ... -
线程安全并且无阻塞的Atomic类
2014-09-24 09:03 6677原子操作AtomicInteger public c ... -
BlockingQueue
2014-09-19 09:51 1305循环队列与优先级队 ... -
Lock的await/singal 和 Object的wait/notify 的区别
2014-09-18 11:23 2224在使用Lock之前,我们都使用Object 的wait和no ... -
多线程类总结
2014-09-16 14:12 1411Executor execute(R ... -
Condition
2014-09-15 13:52 1522Ojbect: wait\noti ... -
Wait-Notify机制
2014-09-15 09:50 1945Wait-Notify机制可以说是实现阻塞操作较为高效的一 ... -
用guava实现简单的事件驱动
2014-07-25 10:28 7975Guava的EventBus可以简化生产/消费模型。Eve ... -
servlet是否是线程安全的
2012-08-06 20:48 3371Servlet/JSP技术 ... -
LinkedBlockingQueue + 单向链表基本结构
2012-06-15 17:28 2371LinkedBlockingQueue是一个单向链表结构的队列 ... -
利用ReentrantReadWriteLock实现缓存系统
2012-06-05 14:17 2796首先解释下缓存系统: 在程序运行 ... -
ReentrantReadWriteLock
2012-06-04 11:00 8385/*public class ReentrantRe ...
相关推荐
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
主要介绍了Java wait和notify虚假唤醒,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态下,系统将给出警告或退出。...
60、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用? 答:有两种实现方法,分别是继承Thread类与实现Runnable接口 用synchronized关键字修饰同步方法 反对使用...
主要介绍了Java多线程基础 线程的等待与唤醒,需要的朋友可以参考下
update() 在线程同步中,为了唤醒另一个等待的线程,使用下列方法 () [单选题] * A.sleep() B.wait() C.notify()(正确答案) D. join() Java高级程序设计测试含答案全文共40页,当前为第4页。Java提供以下哪个...
生产者和消费者是一个十分经典的多线程协作模式 **常见方法:** - void wait() 当前线程等待,直到被其他线程唤醒 - void notify() 随机唤醒单个线程 - void notifyAll() 唤醒所有线程
当JAVA程序违反了JAVA的语义规则时,JAVA虚拟机就会将发生的错误表示为一个异常。违反语义规则包括2种情况。一种是JAVA类库内置的语义检查。例如数组下标越界,会引发IndexOutOfBoundsException;访问null的对象时会...
创建一个老板线程(生产者):花了5秒做包子,做好包子之后,调用notify方法,唤醒顾客吃包子 注意: 顾客和老板线程必须使用同步代码块包裹起来,保证等待和唤醒只能有一个在执行 同步使用的锁对象必须保证唯一 只有锁...
在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态下,系统将给出警告或退出。...
唤醒在此对象监视器上等待的单个线程,如果所有线程都在此对象上等待,则会任意选择唤醒其中一个线程。 public final void wait() 当前线程必须拥有此对象监视器。该线程发布对此监视器的所有权并等待,...
在Object.java中,定义了wait(), notify()和notifyAll()等接口。wait()的作用是让当前线程进入等待状态,同时,wait()也会让当前线程释放它所持有的锁。下面通过本文给大家介绍Java中线程的等待与唤醒知识,感兴趣的...
一个condition对象的signal(signalAll)方法和该对象的await方法是一一对应的,也就是一个condition对象的signal(signalAll)方法不能唤醒其他condition对象的await方法 ReentrantLock类可以唤醒指定条件的...
使用Condition重写waitnotify案例并实现一个有界队列.mp4 深入解析Condition源码.mp4 实战:简易数据连接池.mp4 线程之间通信之join应用与实现原理剖析.mp4 ThreadLocal 使用及实现原理.mp4 并发工具类...
notify():执行该方法的线程唤醒在等待池中等待的任意一个线程,把线程转到锁池中等待(注意锁池和等待池的区别) notifyAll():执行该方法的线程唤醒在等待池中等待的所有线程,把线程转到锁池中等待。 注意:上述...
第32节使用Condition重写wait/notify案例并实现一个有界队列00:22:05分钟 | 第33节深入解析Condition源码00:21:15分钟 | 第34节实战:简易数据连接池00:24:53分钟 | 第35节线程之间通信之join应用与实现原理剖析...
第32节使用Condition重写wait/notify案例并实现一个有界队列00:22:05分钟 | 第33节深入解析Condition源码00:21:15分钟 | 第34节实战:简易数据连接池00:24:53分钟 | 第35节线程之间通信之join应用与实现原理剖析...
第32节使用Condition重写wait/notify案例并实现一个有界队列00:22:05分钟 | 第33节深入解析Condition源码00:21:15分钟 | 第34节实战:简易数据连接池00:24:53分钟 | 第35节线程之间通信之join应用与实现原理剖析...
第32节使用Condition重写wait/notify案例并实现一个有界队列00:22:05分钟 | 第33节深入解析Condition源码00:21:15分钟 | 第34节实战:简易数据连接池00:24:53分钟 | 第35节线程之间通信之join应用与实现原理剖析...