问题在哪里?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发布于 2018-04-28 15:43:16
您应该在不同的线程中使用相同的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();发布于 2018-04-28 18:36:44
在两个不同的线程上使用两个不同的ReentrantLock。@ using 6690200解决方案通过构造函数使用相同的锁是正确的。
另一个解决方案是可以将ReentrantLock更改为:
private static final ReentrantLock reentrantLock = new ReentrantLock();
这样,不同线程的每个实例总是只共享ReentrantLock的一个对象。
https://stackoverflow.com/questions/50077978
复制相似问题