当前位置:网站首页>JUC学习记录(2022.4.22)
JUC学习记录(2022.4.22)
2022-04-23 14:57:00 【彬彬ice】
1、虚假唤醒
多线程环境下,有多个线程执行了wait()方法,需要其他线程执行notify()或者notifyAll()方法去唤醒它们,假如多个线程都被唤醒了,但是只有其中一部分是有用的唤醒操作,其余的唤醒都是无用功;对于不应该被唤醒的线程而言,便是虚假唤醒。
package sync;
/** 当wait在if语句内时,因为进入前已经判断过条件,所以唤醒时(在哪睡,在哪醒)就不会再判断,继续执行下面语句,既发送虚假唤醒 */
class Calculator {
private int num = 0;
public synchronized void increment() throws InterruptedException {
//if (num != 0) { //存在虚假唤醒
// this.wait();
//}
while (num != 0) {
//每次醒都重新判断,解决虚假唤醒
this.wait();
}
num++;
System.out.println(Thread.currentThread().getName() + "+1,当前值:" + num);
this.notifyAll();
}
public synchronized void decrement() throws InterruptedException {
//if (num != 1) { //存在虚假唤醒
// this.wait();
//}
while (num != 1) {
//每次醒都重新判断,解决虚假唤醒
this.wait();
}
num--;
System.out.println(Thread.currentThread().getName() + "-1,当前值:" + num);
this.notifyAll();
}
}
public class Compute {
public static void main(String[] args) {
Calculator calculator = new Calculator();
new Thread(() -> {
try {
for (int i = 0; i < 10; i++) {
calculator.increment();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}, "AA").start();
new Thread(() -> {
try {
for (int i = 0; i < 10; i++) {
calculator.decrement();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}, "BB").start();
new Thread(() -> {
try {
for (int i = 0; i < 10; i++) {
calculator.increment();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}, "CC").start();
new Thread(() -> {
try {
for (int i = 0; i < 10; i++) {
calculator.decrement();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}, "DD").start();
}
}
版权声明
本文为[彬彬ice]所创,转载请带上原文链接,感谢
https://blog.csdn.net/xiaosong2001/article/details/124349053
边栏推荐
- we引用My97DatePicker 实现时间插件使用
- 8.4 realization of recurrent neural network from zero
- LeetCode149-直线上最多的点数-数学-哈希表
- 小红书 timestamp2 (2022/04/22)
- QT Detailed explanation of pro file
- 解决computed属性与input的blur事件冲突问题
- Chapter 7 of JVM series -- bytecode execution engine
- nuxt项目:全局获取process.env信息
- Little red book timestamp2 (2022 / 04 / 22)
- 8.5 concise implementation of cyclic neural network
猜你喜欢
Set up an AI team in the game world and start the super parametric multi-agent "chaos fight"
你还不知道责任链模式的使用场景吗?
What is the role of the full connection layer?
We reference My97DatePicker to realize the use of time plug-in
thinkphp5+数据大屏展示效果
【无标题】
Chapter 7 of JVM series -- bytecode execution engine
Leetcode162 - find peak - dichotomy - array
分布式事务Seata介绍
Explain TCP's three handshakes in detail
随机推荐
ffmpeg安装遇错:nasm/yasm not found or too old. Use --disable-x86asm for a crippled build.
I/O复用的高级应用之一:非阻塞 connect———使用 select 实现(也可以用 poll 实现)
[stc8g2k64s4] introduction of comparator and sample program of comparator power down detection
《JVM系列》 第七章 -- 字节码执行引擎
Share 3 tools, edit 5 works at home and earn more than 400
Share 20 tips for ES6 that should not be missed
go基础 反射
【工厂模式详解】工厂方法模式
Leetcode151 - invert words in string - String - simulation
UML project example -- UML diagram description of tiktok
帧同步 实现
qt之.pro文件详解
Introduction to distributed transaction Seata
Swift: entry of program, swift calls OC@_ silgen_ Name, OC calls swift, dynamic, string, substring
【JZ46 把数字翻译成字符串】
Explain TCP's three handshakes in detail
Provided by Chengdu control panel design_ It's detailed_ Introduction to the definition, compilation and quotation of single chip microcomputer program header file
Explanation and example application of the principle of logistic regression in machine learning
[untitled]
面试官:说一下类加载的过程以及类加载的机制(双亲委派机制)