所以我有类似下面这样的代码
synchronized(objectOne){ do stuff }
synchronized(objectTwo){ do stuff }这样做的问题是,即使objectTwo的锁可用,程序也会等待objectOne上的锁。我想说的是:尝试同时锁定objectOne和objectTwo,无论您先锁定哪个锁,都可以锁定该锁。我已经想出了一个解决方案,但我认为它有点老生常谈,我想知道是否有人有更好的想法。
我的想法是:启动两个线程,每个线程等待一个锁,然后主线程将等待一个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();发布于 2012-11-15 10:02:08
我认为您应该使用为您提供boolean tryLock()方法的Lock。
返回:如果获取了锁,则返回true,否则返回false
当你至少有一个锁的时候,继续做一些事情。
发布于 2012-11-15 10:14:07
您可能希望有2个作业队列,每个队列2个线程轮询一个队列并执行作业。
对于与objectOne相关的作业,将其放在queue#1中;在queue#2中,将与objectTwo相关的作业放入其中。
worker1.queue.put( new Runnable(){ public void run() { do stuff } } );
worker2.queue.put( new Runnable(){ public void run() { do stuff } } );
----
class Worker extends Thread
BlockingQueue<Runnable> queue = new LinkedBlockingQueue<>();
public void run()
while(true)
queue.take().run();发布于 2012-11-15 10:47:31
根据stuff的数量,分离多个线程来做事情可能会有更多的开销。如果stuff是一个足够快的操作,那么在单个线程中做事情可能是最好的。你得计时才能知道。
https://stackoverflow.com/questions/13390436
复制相似问题