- 浏览: 502114 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (449)
- java细节 (186)
- javascript (6)
- tomcat (2)
- java基础 (17)
- extjs (1)
- java 开源 (17)
- java-bug (5)
- 电脑软件 (16)
- oracle-dba (8)
- oracle (6)
- java 精神 (17)
- SSH (6)
- 常用开源 (29)
- Mysql (22)
- 电脑学习 (8)
- jsp (12)
- html5 (6)
- hadoop (3)
- webos (2)
- web前端开发 (7)
- java实践 (2)
- 其它 (19)
- python (4)
- c++ (1)
- linux (2)
- css3+h5 (9)
- bootstrap (12)
- ps (1)
- vue (5)
- android (3)
最新评论
-
springdata_springmvc:
java inputstream demo教程源代码下载:ht ...
文件的读写 -- java FileInputStream -
hukaimiao:
[/c佛挡[size=x-small][color=darkr ...
文件的读写 -- java FileInputStream -
wwm4851186:
可惜这是中国
10大技能 让你坐享10万美元薪酬 -
zhubo357087527:
楼主,这样写可以吗?用“Process proc = Runt ...
在java中如何调用linux的ctrl+c指令?
notify()和notifyAll()都是Object对象用于通知处在等待该对象的线程的方法。两者的最大区别在于:
notifyAll使所有原来在该对象上等待被notify的线程统统退出wait的状态,变成等待该对象上的锁,一旦该对象被解锁,他们就会去竞争。
notify则文明得多他只是选择一个wait状态线程进行通知,并使它获得该对象上的锁,但不惊动其他同样在等待被该对象notify的线程们,当第一个线程运行完毕以后释放对象上的锁此时如果该对象没有再次使用notify语句,则即便该对象已经空闲,其他wait状态等待的线程由于没有得到该对象的通知,继续处在wait状态,直到这个对象发出一个notify或notifyAll,它们等待的是被notify或notifyAll,而不是锁。
下面是一个很好的例子:
import java.util.*;
class Widget...{}
class WidgetMaker extends Thread...{
List<Widget> finishedWidgets=new ArrayList<Widget>();
public void run()...{
try...{
while(true)...{
Thread.sleep(5000);//act busy
Widget w=new Widget();
//也就是说需要5秒钟才能新产生一个Widget,这决定了一定要用notify而不是notifyAll
//因为上面两行代码不是同步的,如果用notifyAll则所有线程都企图冲出wait状态
//第一个线程得到了锁,并取走了Widget(这个过程的时间小于5秒,新的Widget还没有生成)
//并且解开了锁,然后第二个线程获得锁(因为用了notifyAll其他线程不再等待notify语句
//,而是等待finishedWidgets上的锁,一旦锁放开了,他们就会竞争运行),运行
//finishedWidgets.remove(0),但是由于finishedWidgets现在还是空的,
//于是产生异常
//***********这就是为什么下面的那一句不能用notifyAll而是要用notify
synchronized(finishedWidgets)...{
finishedWidgets.add(w);
finishedWidgets.notify(); //这里只能是notify而不能是notifyAll
}
}
}
catch(InterruptedException e)...{}
}
public Widget waitForWidget()...{
synchronized(finishedWidgets)...{
if(finishedWidgets.size()==0)...{
try...{
finishedWidgets.wait();
}
catch(InterruptedException e)
...{}
}
return finishedWidgets.remove(0);
}
}
}
public class WidgetUser extends Thread...{
private WidgetMaker maker;
public WidgetUser(String name,WidgetMaker maker)...{
super(name);
this.maker=maker;
}
public void run()...{
Widget w=maker.waitForWidget();
System.out.println(getName()+"got a widget");
}
public static void main(String[] args) ...{
WidgetMaker maker=new WidgetMaker();
maker.start();
new WidgetUser("Lenny",maker).start();
new WidgetUser("Moe",maker).start();
new WidgetUser("Curly",maker).start();
}
}
发表评论
-
idea 设置自动编译
2023-06-13 09:39 484https://www.cnblogs.com/bxzmd/p ... -
eclipse 下载的地方
2023-05-31 00:43 248参考 https://baijiahao.baidu.com/ ... -
eclipse导入 idea
2023-03-19 21:27 314转: https://blog.csdn.net/qq_526 ... -
@DataSource切换数据库失效
2022-08-08 11:31 822在实现类中 再次注入即可 public class Face ... -
jar下载地址
2022-02-11 23:34 3511、进入官网:https://sourceforge.net/ ... -
java 测试两个月前的今天-改为保留60天-bug
2021-08-18 14:03 591比如今天是8.31 两个月前是 6.30。 但是存在问题,比如 ... -
idea 常见配置
2021-06-07 17:11 3591 sst 8.37 checkstyle 版本 2 设置c ... -
linux定时清理日志
2020-09-21 13:36 490clearlog.sh #!/bin/bash # 清理30 ... -
前端中文传到后台乱码
2020-09-10 23:35 661info = new String(info.getBytes ... -
linux 开机自启动
2020-09-07 10:20 438run.sh 文件内容如下: #!/bin/bash cd ... -
nodejs 和npm对应关系
2020-08-07 09:45 2188https://nodejs.org/en/download/ ... -
mybatis 插入库 乱码
2020-05-10 12:25 375jdbc:mysql://127.0.0.1:3306/tes ... -
Transactional 不生效(转)
2020-04-16 12:33 383@Transactional 默认是当方法抛出RuntimeE ... -
全栈开发
2020-03-11 21:51 369全栈开发没有明确的定义,但应该指的就是前端+后端+数据库。所以 ... -
rocketmq-一个消费组对应一个订阅关系
2019-10-23 10:39 816源码分析RocketMQ同一个消费组设置不同tag,消息订阅失 ... -
rocketmq 标签过滤的方式
2019-10-21 09:16 451https://www.kunzhao.org/blog/20 ... -
json 转 对象
2019-09-30 16:48 382单个 XX a = JsonUtils.fromJson(js ... -
springboot @RequestBody 和 @RequestParam
2019-09-09 23:08 1305一 在路径中 在PathVariable后面接入“uid”就可 ... -
java.sql.SQLException: Parameter index out of range (1 > number of parameters, w
2019-08-28 22:42 626完整错误: java.sql.SQLException: Pa ... -
List 简洁赋值
2019-08-14 10:35 578List<String> name = new A ...
相关推荐
- 功能:使当前线程放弃对象锁并进入等待状态,直到收到`notify()`或`notifyAll()`通知后才有机会重新获取锁。 #### Overload与Override的区别 - **Overloading**(重载): - 概念:在同一类中,允许存在一个...
这本书以其详尽的解释、丰富的示例和对Java本质的理解而备受赞誉。以下将根据书名和描述,结合“java”这一标签,探讨Java编程语言的核心知识点。 1. **Java基础** - **变量与数据类型**:Java有基本数据类型(如...
- **线程通信**:了解`wait()`, `notify()`, `notifyAll()`方法以及`BlockingQueue`等同步机制,用于线程间的通信和协作。 - **异常处理**:确保线程在执行过程中正确处理异常,防止整个应用因为单个线程的问题而...
6. **多线程**:Java提供了内置的多线程支持,包括Thread类和Runnable接口,以及同步机制如synchronized关键字、wait()、notify()和notifyAll()方法。 7. **输入/输出流**:Java的I/O流系统涵盖了文件读写、网络...
6. **多线程**:讲述了如何在Java中创建和管理线程,以及同步机制,如synchronized关键字、wait()、notify()和notifyAll()方法。 7. **输入/输出(I/O)**:包括文件操作、流的概念、序列化和网络I/O,这对于处理...
- `wait`: 属于`Object`类的方法,用于使当前线程等待,直到其他线程调用此对象上的`notify()`或`notifyAll()`方法。 - `sleep`: 属于`Thread`类的静态方法,用于使当前正在执行的线程暂停执行指定的时间。 - **锁...
5. **多线程编程**:Java支持多线程编程,书中介绍了线程的创建、同步和通信,包括synchronized关键字、wait()、notify()和notifyAll()方法,以及线程池的使用,让开发者能够编写高效的并发程序。 6. **输入/输出和...
线程同步机制(如synchronized关键字、wait()、notify()和notifyAll()方法、Lock接口等)用于解决并发编程中的线程安全问题。 7. **泛型**:泛型引入于Java 5,用于在编译时检查类型安全,并且允许在代码中存储任意...
源码中会包含各种同步机制的示例,如同步方法、同步代码块、`wait()`、`notify()`和`notifyAll()`等。 3. **死锁与活锁**:死锁是指两个或多个线程互相等待对方释放资源导致无法继续执行的情况。活锁则是线程虽然...
`wait()`, `notify()`, `notifyAll()`方法用于线程间的通信和协作;`java.util.concurrent`包下有各种高级并发工具,如`Semaphore`(信号量)用于控制同时访问特定资源的线程数量,`CyclicBarrier`和`CountDownLatch`...
7. **线程通信**:Java的`wait()`, `notify()`, `notifyAll()`方法和`java.util.concurrent`包中的`Condition`接口,提供了线程间通信的方式,使得线程能够协调执行。 8. **并发工具类**:包括CountDownLatch、...
阻塞锁,作为Java并发控制的一种重要手段,与自旋锁有着本质的区别。自旋锁会让线程在未获取锁时持续循环检查,直到获取到锁为止,而阻塞锁则会直接使线程进入阻塞状态,等待被其他线程唤醒。 在Java中,线程有五种...