所以我有类似的代码
synchronized(objectOne){ do stuff }
synchronized(objectTwo){ do stuff }
这样做的问题是程序将等待 lock on objectOne
,即使 lock forobjectTwo
可用。我要做的是说:尝试同时锁定objectOne
和objectTwo
,并且无论您先获得哪个锁,都可以为该锁做些事情。我想出了一个解决方案,但我认为它相当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();