ReentrantLock.tryLock()没有锁定

Chr*_*ris 3 java concurrency multithreading

我想我过去没有看到过这样的事情.

我的锁没有持有独占锁,当创建对象的新实例时,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());
    }
}
Run Code Online (Sandbox Code Playgroud)

JB *_*zet 10

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

如果您真的想要从构造函数而不是静态块进行调度,则应该使用静态AtomicBoolean变量,并且仅在compareAndSet(false, true)返回true时调度计时器.