- 浏览: 6357978 次
- 性别:
- 来自: 一片神奇的土地
文章分类
- 全部博客 (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 2088大白话聊聊Java并发面试问题之谈谈你对AQS的理解? ... -
JAVA内存模型-(程锁V传+启断终结)
2018-04-25 11:29 1030Java并发编程:volatile关键字解析-(重要,分析 ... -
ArrayBlockingQueue
2018-04-18 15:54 1324ArrayBlockingQueue p ... -
【多线程总结】
2017-12-12 15:53 698线程需要注意的地方: 1、 public final s ... -
服务器集群对Synchronized有没有什么影响
2015-11-11 15:39 5483有个功能大致如下,在一堆没用过的数据中取一条数据,并将其标 ... -
获取id 的一种策略
2015-07-07 17:48 1989从数据库中批量(step个)拿出Id,然后使用,待消耗完后 ... -
模拟的线程池
2014-09-25 09:51 1791自定义数据库连接池 例子: public cla ... -
Thread例子
2014-09-24 17:53 5876看看对Thread到底懂多少,嘿嘿 Exampl ... -
FairSync与NonfairSync
2014-09-24 16:50 6728state 为0,表示锁未被获取 不为0,表示已被获取 ... -
线程安全并且无阻塞的Atomic类
2014-09-24 09:03 6723原子操作AtomicInteger public c ... -
BlockingQueue
2014-09-19 09:51 1359循环队列与优先级队 ... -
Lock的await/singal 和 Object的wait/notify 的区别
2014-09-18 11:23 2288在使用Lock之前,我们都使用Object 的wait和no ... -
多线程类总结
2014-09-16 14:12 1459Executor execute(R ... -
Condition
2014-09-15 13:52 1580Ojbect: wait\noti ... -
Wait-Notify机制
2014-09-15 09:50 2008Wait-Notify机制可以说是实现阻塞操作较为高效的一 ... -
用guava实现简单的事件驱动
2014-07-25 10:28 8039Guava的EventBus可以简化生产/消费模型。Eve ... -
servlet是否是线程安全的
2012-08-06 20:48 3426Servlet/JSP技术 ... -
LinkedBlockingQueue + 单向链表基本结构
2012-06-15 17:28 2423LinkedBlockingQueue是一个单向链表结构的队列 ... -
利用ReentrantReadWriteLock实现缓存系统
2012-06-05 14:17 2844首先解释下缓存系统: 在程序运行 ... -
ReentrantReadWriteLock
2012-06-04 11:00 8445/*public class ReentrantRe ...
相关推荐
2. **notify()**:这个方法会唤醒在当前对象监视器上等待的一个线程。如果有多个线程在等待,系统会随机选择其中一个线程进行唤醒。被唤醒的线程并不会立即执行,而是要等到当前线程释放锁之后,才能进入临界区。 3...
wait方法是Object类的一个方法,用于让当前线程进入等待状态,直到其他线程调用notify或notifyAll方法来唤醒它。在wait方法中,当前线程会释放它所占有的锁,并进入等待状态。wait方法可以带有参数,指定等待的时间...
当一个线程调用`notify()`方法时,它会选择在等待队列中任意一个处于等待状态的线程进行唤醒,但并不释放锁,这意味着被唤醒的线程需要在下次获取锁时竞争。由于`notify()`只能唤醒一个线程,所以有时可能需要多次...
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
1. `wait()`: 当一个线程调用某个对象的`wait()`方法时,它会释放该对象的锁,并进入等待状态,直到其他线程调用了该对象的`notify()`或`notifyAll()`方法唤醒它。等待的线程不会自动恢复执行,而是需要重新竞争对象...
`notify()` 则会随机选择一个等待在该对象监视器上的线程并唤醒它,而 `notifyAll()` 则会唤醒所有等待的线程。 在实际应用中,我们通常使用 `synchronized` 关键字来确保对共享资源的访问是互斥的,同时保证 `wait...
消费者线程在移除元素后会调用`notify()`或`notifyAll()`来唤醒一个或所有等待的生产者线程,告知它们缓冲区现在有空间了。 #### 线程通信 在多线程环境中,线程之间往往需要进行通信,以避免数据竞争或死锁。`...
2. `notify()`:唤醒在该对象监视器上等待的一个线程。如果有多个线程等待,系统会选择一个线程,但选择策略是不确定的。唤醒的线程不会立即执行,而是变为可运行状态,需要与其他线程竞争获取锁。 3. `notifyAll()...
- 调用`b.wait()`,这会让当前线程进入等待状态,直到另一个线程调用`b.notify()`或`b.notifyAll()`唤醒它。 - 输出完成后的总和。 - **`ThreadB`类**: - 继承自`Thread`类,重写了`run`方法。 - 在`run`方法...
3. `notify()`只能唤醒条件队列中的一个线程,而`notifyAll()`会唤醒所有线程,但只有获得锁的线程才能继续执行。 4. 被唤醒的线程并不立即执行,而是等待锁的释放。当调用`notify()`或`notifyAll()`的线程退出`...
这是Java并发编程中一个重要的概念,因为根据JVM规范,`wait()`可能会发生虚假唤醒,尽管这在实际应用中很少出现。为了解决这个问题,通常在使用`wait()`和`notify()`时,需要配合使用循环检查等待条件是否满足,而...
_java多线程wait、notify机制详解_ 在Java多线程编程中,wait和notify是两个非常重要的机制,用于实现线程之间的...通过这篇文章,读者可以更好地理解和掌握wait和notify机制,从而更好地编写高效、可靠的多线程程序。
notify()方法是唤醒一个正在wait当前对象的线程,并让被唤醒的线程拿到对象锁。该方法的调用也必须在synchronized代码块或者方法中,因为notify()方法需要当前线程必须获得对象锁。 三、notifyAll()方法 notifyAll...
3. **notifyAll()**:与`notify()`类似,但它会唤醒所有等待该对象的线程,这些线程都会尝试获取对象锁,最终只有一个成功并继续执行,其他线程仍然会在锁池中等待。 现在我们来看`sleep()`方法,它来自Thread类,...
`notify()`方法则是用来唤醒在指定对象上等待的一个线程。当调用`notify()`时,会随机选择一个在该对象上等待的线程并将其从等待池移到可运行队列。需要注意的是,唤醒的线程并不立即执行,而是需要等到当前持有锁的...
首先,`wait()`方法会导致当前线程进入等待状态,直到其他线程调用同一个对象的`notify()`或`notifyAll()`方法唤醒它。而`notify()`方法则会唤醒一个正在该对象上等待的线程,如果有多个线程在等待,哪个线程被唤醒...
Java等待唤醒机制是Java多线程编程中一个重要的概念,它涉及到线程间的协作与通信。在Java中,主要通过`Object`类提供的`wait()`、`notify()`和`notifyAll()`方法来实现这一机制。这些方法使得线程可以在特定条件下...
2. `notify()`: 这个方法用于唤醒在当前对象上等待的一个线程。但这里有一个重要特性:唤醒是随机的,系统会选择一个等待线程并将其唤醒,而其他等待线程依然保持等待状态。 3. `notifyAll()`: 与`notify()`不同,`...
当一个线程调用对象的 `wait()` 方法时,它会释放该对象的锁并进入等待状态,直到其他线程调用 `notify()` 或 `notifyAll()` 来唤醒它。`notify()` 唤醒单个等待线程,而 `notifyAll()` 唤醒所有等待线程。这种机制...
Java中的wait/notify/notifyAll可用来实现线程间通信,是Object类的方法,这三个方法都是native方法,是平台相关的,常用来实现生产者/消费者模式。 wait()方法将当前线程置于等待状态,直到其他线程调用notify()或...