首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ReentrantLock没有显示预期结果

ReentrantLock没有显示预期结果
EN

Stack Overflow用户
提问于 2018-04-28 15:12:34
回答 2查看 48关注 0票数 0

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

代码语言:javascript
复制
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();
    }
}

产出:

代码语言:javascript
复制
executing : Thread - 1
executing : Thread - 2
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-28 15:43:16

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

将构造函数更改为:

代码语言:javascript
复制
ReentrantLock reentrantLock;
MyThread2(String name, ReentrantLock lock){
    this.name = name;
    this.reentrantLock = lock;
}

把同样的锁传给他们:

代码语言:javascript
复制
ReentrantLock lock = new ReentrantLock();
new MyThread2("Thread - 1", lock).start();
new MyThread2("Thread - 2", lock).start();
票数 5
EN

Stack Overflow用户

发布于 2018-04-28 18:36:44

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

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

private static final ReentrantLock reentrantLock = new ReentrantLock();

这样,不同线程的每个实例总是只共享ReentrantLock的一个对象。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50077978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档