ReentrantLock 未显示预期结果

ReentrantLock is not showing expected result

问题出在哪里? ReentrantLock 未显示预期结果。两个线程同时执行,而不是等待一个线程。

class MyThread2 extends Thread{
    String name;
    ReentrantLock reentrantLock = new ReentrantLock();
    MyThread2(String name){
        this.name = name;
    }
    public void run(){
        do {
            try {
                if (reentrantLock.tryLock(20,TimeUnit.MILLISECONDS)){
                    System.out.println("executing : "+ name);
                    Thread.sleep(500);
                    reentrantLock.unlock();
                    break;
                }else {
                    System.out.println("waiting "+ name);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }while (true);
    }
}

public class LockDemo2{
    public static void main(String[] args) {
        new MyThread2("Thread - 1").start();
        new MyThread2("Thread - 2").start();
    }
}

输出:

executing : Thread - 1
executing : Thread - 2

您应该在不同的线程中使用相同的 ReentrantLock,而不是创建不同的锁。

将构造函数更改为:

ReentrantLock reentrantLock;
MyThread2(String name, ReentrantLock lock){
    this.name = name;
    this.reentrantLock = lock;
}

并将相同的锁传递给他们:

ReentrantLock lock = new ReentrantLock();
new MyThread2("Thread - 1", lock).start();
new MyThread2("Thread - 2", lock).start();

您在两个不同的线程上使用了两个不同的 ReentrantLock。 @user6690200 通过构造函数使用相同锁的解决方案是正确的。

另一个解决方案是您可以将 ReentrantLock 更改为:

private static final ReentrantLock reentrantLock = new ReentrantLock();

这样不同线程的每个实例将始终只共享您的 ReentrantLock 的一个对象。