computeIfAbsent是线程安全的吗
时间: 2024-01-03 14:22:31 浏览: 251
JDK1.8中ConcurrentHashMap中computeIfAbsent死循环bug.docx
根据提供的引用内容,computeIfAbsent方法是线程安全的。当多个线程同时调用computeIfAbsent方法时,它会确保只有一个线程能够执行计算操作,并且其他线程会等待计算完成后获取结果。这样可以避免多个线程同时计算相同的值,提高了线程安全性。
下面是一个示例代码,演示了computeIfAbsent方法的线程安全性:
```java
import java.util.concurrent.ConcurrentHashMap;
public class ThreadSafeExample {
private static ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
public static void main(String[] args) {
// 创建两个线程同时调用computeIfAbsent方法
Thread thread1 = new Thread(() -> {
int value = map.computeIfAbsent("key", k -> {
// 模拟计算操作
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return 1;
});
System.out.println("Thread 1: " + value);
});
Thread thread2 = new Thread(() -> {
int value = map.computeIfAbsent("key", k -> {
// 模拟计算操作
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return 2;
});
System.out.println("Thread 2: " + value);
});
// 启动线程
thread1.start();
thread2.start();
// 等待线程执行完成
try {
thread1.join();
thread2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
```
运行以上代码,可以看到只有一个线程执行了计算操作,另一个线程等待计算完成后获取结果。这证明了computeIfAbsent方法的线程安全性。
阅读全文