java - Java - 在方法中允许一个线程而无需等待
问题描述
我有一种情况,我需要实现一个线程安全的方法,该方法一次只能由一个线程执行,并且当该方法由一个线程执行时,所有其他尝试执行相同方法的线程都应该' t 等待并且必须退出该方法。
同步在这里无济于事,因为线程将等待顺序执行该方法。
我想我可以通过使用下面的代码使用 ConcurrentHashMap 来实现这一点,但不确定这是否是实现它的完美方式。
Class Test {
private ConcurrentHashMap<String, Object> map = new ConcurrentHashMap<>();
public void execute() {
if (map.putIfApsent("key", new Object()) != null) { // map has value for key which means a thread has already entered.
return; // early exit
}
threadSafeMethod();
map.remove("key");
}
private void threadSafeMethod() {
// my code
}
}
解决方案
您可以在不同步的情况下执行此操作,使用布尔值进行比较和交换:
private AtomicBoolean entered = new AtomicBoolean(false);
public void execute() {
if(entered.compareAndSet(false,true) {
try {
method()
} finally {
entered.set(false)
}
}
}
推荐阅读
- android - 为汽车修改 AOSP ( Android-Source ) 的系统主题
- python - 如何在 python 中使用 pandas 计算 csv 文件中的唯一行数
- wso2 - 超时问题 - http-incoming-1 套接字超时:180000 远程地址:/127.0.0.1:59531
- macos - 如何使用 VIM(buffer) 快速编辑剪贴板内容
- c# - 抽象类和继承类中的接口
- graph - Elm:如何用时间戳绘制线性图
- sql - 如何在pyspark中使用具有相同客户ID的新数据框的值更新一行旧数据框
- c# - 尝试将数据上传到我的数据库时,“列名或提供的值的数量与表定义不匹配”
- ubuntu - 如何在 ubuntu 中构建外部模块?
- c# - .Net core 3.1 worker 服务自包含发布在 vs 2019 中失败