java - ReentrantLock.tryLock() 没有锁定

标签 java multithreading concurrency

我想我只是没有看到一些东西,因为我过去已经让它工作了。

我的锁没有持有独占锁,当创建对象的新实例时,tryLock 返回 true 并安排另一个 TimerTask

public class A {
    private static Timer timer = new Timer();
    private static Lock clean_lock = new ReentrantLock();
    private static ConcurrentHashMap<String,B> _b_dict = new ConcurrentHashmap<String,B>();

    public A() {
        if(clean_lock.tryLock()) {
            timer.scheduleAtFixedRate(new TimerTaskThread(), new Date(), 60000);
        }
    }

    //Various NON static methods 
    // use an iterator at one point so they must be NON static

    class TimerTaskThread extends TimerTask {
        public void run() {
            //delete old stuff in _b_dict
        }
    }
}

//sample usage
public class Main {
    public Main() {
        A a = new A();
        a.contains(new B());
    }
}

最佳答案

您是否正在从另一个线程创建另一个 A 实例?因为如果您从同一个线程创建两个实例,那么锁是可重入的,tryLock 显然会返回 true。

如果你真的想从构造函数中调度,而不是从静态 block 中调度,你应该使用静态 AtomicBoolean 变量,并且仅在 compareAndSet(false, true)< 时调度计时器 返回真。

关于java - ReentrantLock.tryLock() 没有锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8837494/

相关文章:

Java Servlet Mimetype 和 Internet Explorer mimetype 处理错误

java - Thymeleaf:URL 中的参数未被替换

python - 在 Python 中对列表中的每个项目进行线程处理

.net - 为什么 Windows\Assembly 中可能缺少 System.Threading.dll?

java - 在Java中将多个变量初始化为相同的值

用于性能优化的 C++ 分离函数

postgresql - 为什么 PostgreSQL 中止这个可序列化的计划

java - WorkStealingPool 和 ThreadPoolExecutor 在与 CompletableFuture 一起使用时会产生不同的结果

c# - 使用 "ConcurrentDictionary.GetOrAdd()"时避免陈旧(逻辑上损坏)数据,包括重现代码

java - 无法在 FOPTransformer 中包含 Arial 字体