当前位置:网站首页>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
边栏推荐
猜你喜欢

冰冰学习笔记:一步一步带你实现顺序表

【无标题】

剑指 Offer II 019. 最多删除一个字符得到回文(简单)

8.5 concise implementation of cyclic neural network

OC 转 Swift 条件编译、标记、宏、 Log、 版本检测、过期提示

capacitance
![[stc8g2k64s4] introduction of comparator and sample program of comparator power down detection](/img/8c/e72e628a44a36bfc7406a002d00215.png)
[stc8g2k64s4] introduction of comparator and sample program of comparator power down detection

How does eolink help telecommuting

Progress in the treatment of depression

Role of asemi rectifier module mdq100-16 in intelligent switching power supply
随机推荐
[jz46 translate numbers into strings]
PCIe X1 插槽的主要用途是什么?
Fill in the next right node pointer II of each node [classical hierarchy traversal | regarded as linked list]
Swift: entry of program, swift calls OC@_ silgen_ Name, OC calls swift, dynamic, string, substring
Svn detailed use tutorial
One of the advanced applications of I / O reuse: non blocking connect -- implemented using select (or poll)
[stc8g2k64s4] introduction of comparator and sample program of comparator power down detection
Arduino for esp8266串口功能简介
What is the main purpose of PCIe X1 slot?
压缩映射定理
Don't you know the usage scenario of the responsibility chain model?
qt之.pro文件详解
async void 导致程序崩溃
冰冰学习笔记:一步一步带你实现顺序表
8.4 realization of recurrent neural network from zero
Epolloneshot event of epoll -- instance program
js——實現點擊複制功能
脏读、不可重复读和幻读介绍
thinkphp5+数据大屏展示效果
Flink DataStream 类型系统 TypeInformation