如何在Java中没有排序约束的情况下获取多个锁?

use*_*426 9 java concurrency locking

所以我的代码与此类似

synchronized(objectOne){ do stuff }
synchronized(objectTwo){ do stuff }
Run Code Online (Sandbox Code Playgroud)

这个问题是程序将等待锁定objectOne,即使锁定objectTwo可用.我正在试图做的是说:尽量同时锁定objectOneobjectTwo,并取其锁定你会首先对该锁做的东西.我想出了一个解决方案,但我认为它相当hacky,我想知道是否有人有更好的想法.

这是我的想法:启动2个线程,每个线程等待一个锁,然后主线程将在CountDownLatch上等待.所以你最终得到这样的东西:

CountDownLatch latch = new CountDownLatch(2);

new Thread(new Runnable(){
public void run(){
    synchronized(objectOne) { do stuff }
    latch.countDown();
}).start();

new Thread(new Runnable(){
public void run(){
    synchronized(objectTwo) { do stuff }
    latch.countDown();
}).start();

latch.await();
Run Code Online (Sandbox Code Playgroud)

Bhe*_*ung 5

我认为你应该用Lock它来为你提供方法boolean tryLock().

返回:如果获取了锁,则返回true,否则返回false

当你至少有一个锁时,继续做一些事情.