java线程解锁_java-线程-使用标志解锁锁,然后尝试/最终

我正在尝试同步3个线程.他们每个人都处理一条履带,履带沿着自己的路径移动.

不幸的是,他们的道路像这样越过:

为了实现这个目标,我使用了锁.有两个共享块的部分:水平和垂直(我在上面和下面将其命名).问题在于一个线程要同时位于两个共享部分中.

我的问题是:

我可以使用标志解锁try / finally子句中的锁吗?

我的意思是,当线程在try / finally子句中解锁锁时,会设置一个标志,并在finally子句中检查该标志是否已设置,然后不再进行第二次解锁.我认为这是一个安全的解决方案,但也许我错了.

还有其他同步线程的方法吗?

这是我的代码:(几乎可以正常工作)

public void moveForward() throws InterruptedException {

redIsUpofAbove();

int choose= 0;

if (Route.critcalSectionAbove.contains(head))

choose= 1;

if (Route.critcalSectionBelow.contains(head))

choose= 2;

switch (choose) {

case 1: {

boolean flag = true;

System.err.println(name + " Lock above");

synchronization.aboveLock.lock();

try {

takeNextGrid();

Thread.sleep(sleepValue);

while (isInAboveCriticalSection()) {

takeNextGrid();

Thread.sleep(sleepValue);

if (isInBelowCriticalSection()) {// Caterpillar is on two

// shared sections

System.out.println(name + " Lock below");

if (!synchronization.belowLock.tryLock()) {

synchronization.aboveLock.unlock();

System.out.println(name + " Unlock above");

synchronization.belowLock.lock();

flag = false;

}

try {

while (isInBelowCriticalSection()) {

takeNextGrid();

if (!isInAboveCriticalSection() && flag) {

synchronization.aboveLock.unlock();

flag = false;

System.out.println(name + " Unlock above");

}

Thread.sleep(sleepValue);

}

} catch (Exception e) {

} finally {

synchronization.belowLock.unlock();

System.err.println(name + "Unlock belovelock");

}

}

}

} catch (Exception e) {

} finally {

if (flag) {

synchronization.aboveLock.unlock();

System.out.println(name + " unlock above");

}

}

break;

}

case 2: {

boolean flag = true;

System.err.println(name + " Lock below");

synchronization.belowLock.lock();

try {

takeNextGrid();

Thread.sleep(sleepValue);

while (isInBelowCriticalSection()) {

takeNextGrid();

Thread.sleep(sleepValue);

if (isInAboveCriticalSection()) {

if (!synchronization.aboveLock.tryLock() && flag) {

synchronization.belowLock.unlock();

System.out.println(name + " Unlock below");

synchronization.aboveLock.lock();

flag = false;

}

try {

System.out.println(name + " Lock above");

while (isInAboveCriticalSection()) {

takeNextGrid();

if (!isInBelowCriticalSection() && flag == true) {

synchronization.belowLock.unlock();

flag = false;

System.out.println(name + " Lock below");

}

Thread.sleep(sleepValue);

}

} catch (Exception e) {

} finally {

synchronization.aboveLock.unlock();

System.err.println(name + "Lock abovelock");

}

}

}

} catch (Exception e) {

} finally {

if (flag) {

synchronization.belowLock.unlock();

System.out.println("Opuszczam belowLock");

}

}

break;

}

default: {

takeNextGrid();

break;

}

}

}

最后一个问题:

在等待锁定锁的线程上,是否可以设置唤醒优先级?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值