首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java中如何在没有排序约束的情况下获取多个锁?

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

Stack Overflow用户
提问于 2012-11-15 09:49:46
回答 4查看 715关注 0票数 9

所以我有类似下面这样的代码

代码语言:javascript
复制
synchronized(objectOne){ do stuff }
synchronized(objectTwo){ do stuff }

这样做的问题是,即使objectTwo的锁可用,程序也会等待objectOne上的锁。我想说的是:尝试同时锁定objectOneobjectTwo,无论您先锁定哪个锁,都可以锁定该锁。我已经想出了一个解决方案,但我认为它有点老生常谈,我想知道是否有人有更好的想法。

我的想法是:启动两个线程,每个线程等待一个锁,然后主线程将等待一个CountDownLatch。所以你最终会得到这样的结果:

代码语言:javascript
复制
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();
EN

回答 4

Stack Overflow用户

发布于 2012-11-15 10:02:08

我认为您应该使用为您提供boolean tryLock()方法的Lock

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

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

票数 5
EN

Stack Overflow用户

发布于 2012-11-15 10:14:07

您可能希望有2个作业队列,每个队列2个线程轮询一个队列并执行作业。

对于与objectOne相关的作业,将其放在queue#1中;在queue#2中,将与objectTwo相关的作业放入其中。

代码语言:javascript
复制
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();
票数 2
EN

Stack Overflow用户

发布于 2012-11-15 10:47:31

根据stuff的数量,分离多个线程来做事情可能会有更多的开销。如果stuff是一个足够快的操作,那么在单个线程中做事情可能是最好的。你得计时才能知道。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13390436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档