【发布时间】:2019-03-14 13:05:09
【问题描述】:
我正在尝试在多线程上实现可重入锁,但由于某种原因,同一个线程解锁然后再次锁定,导致始终运行同一个线程,因此执行相同的操作。
下面是线程是如何产生的代码
IntStream.range(0,(NUMBER_OF_THREADS)).forEach(index ->{
boolean operation = (index % 2 == 0) ? true : false;
Thread t = new Thread(new Client(operation,this));
t.start();
});
这是线程的运行函数的工作原理
@Override
public void run() {
while(!Thread.interrupted()) {
System.out.println("Trying to acquire lock : " + main.getLock().tryLock()
+ " thread id " + Thread.currentThread().getName());
// if (main.getLock().tryLock()) {
try {
main.getLock().lock();
if(main.getLock().isHeldByCurrentThread()) {
System.out.println("Lock held by this thread " + main.getLock().isHeldByCurrentThread()
+ " thread id : " + Thread.currentThread().getName());
if (operation) {
main.getcAaccount().deposit(1);
} else {
main.getcAaccount().withdraw(2);
}
Thread.currentThread().sleep(3000);
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
System.out.println("Thread id : " + Thread.currentThread().getName() + " unlocking");
main.getLock().unlock();//always have the unlock part here to ensure it unlock
}
}
它正确打印出其他 5 个线程正在尝试获取锁并失败,然后线程 id...正在解锁...并立即再次锁定相同的线程,即使它应该处于睡眠状态。
我在这个逻辑场景中遗漏了什么吗?
提前谢谢你。
【问题讨论】:
-
你的目标是什么?你想完成什么?
-
你已经通过
tryLock()获得了锁,为什么还要调用lock()? -
阻塞的并发,一个线程存入另一个线程,但顺序无关紧要。我只是不明白为什么同一个线程在应该休眠时解锁然后获取锁
标签: java multithreading reentrantlock