当前位置:网站首页>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
边栏推荐
- 压缩映射定理
- Swift - literal, literal protocol, conversion between basic data types and dictionary / array
- What is the effect of Zhongfu Jinshi wealth class 29800? Walk with professional investors to make investment easier
- How to write the keywords in the cover and title? As we media, why is there no video playback
- Swift protocol Association object resource name management multithreading GCD delay once
- How does eolink help telecommuting
- 8.4 realization of recurrent neural network from zero
- go基础 反射
- 3、 Gradient descent solution θ
- Progress in the treatment of depression
猜你喜欢
Swift Protocol 关联对象 资源名称管理 多线程GCD 延迟 once
博睿数据携手F5共同构建金融科技从代码到用户的全数据链DNA
Progress in the treatment of depression
Leetcode162 - find peak - dichotomy - array
Bingbing learning notes: take you step by step to realize the sequence table
LeetCode162-寻找峰值-二分-数组
1-初识Go语言
[untitled]
Explanation and example application of the principle of logistic regression in machine learning
【JZ46 把数字翻译成字符串】
随机推荐
LeetCode 练习——396. 旋转函数
Vscode Chinese plug-in doesn't work. Problem solving
Go basic reflection
January 1, 1990 is Monday. Define the function date_ to_ Week (year, month, day), which realizes the function of returning the day of the week after inputting the year, month and day, such as date_ to
Swift: entry of program, swift calls OC@_ silgen_ Name, OC calls swift, dynamic, string, substring
Explain TCP's three handshakes in detail
LeetCode149-直线上最多的点数-数学-哈希表
Tencent has written a few words, Ali has written them all for a month
LeetCode165-比较版本号-双指针-字符串
LeetCode162-寻找峰值-二分-数组
How do I open the win10 startup folder?
Realization of four data flow modes of grpc based on Multilingual Communication
Redis master-slave synchronization
【无标题】
Vous ne connaissez pas encore les scénarios d'utilisation du modèle de chaîne de responsabilité?
How to upload large files quickly?
免费在upic中设置OneDrive或Google Drive作为图床
Detailed analysis of SQL combat of Niuke database (26-30)
Async void caused the program to crash
22年了你还不知道文件包含漏洞?