如何在执行方法时锁定实例

时间:2014-04-21 20:18:40

标签: java multithreading thread-safety locking

我不知道这个问题是否多余,但我在找了2个小时后找到答案......

我试图创建一个使用多个线程和一个类的共享实例的程序。当调用此实例上的某个方法时,让我们调用它"重新连接",其他方法调用应等到"重新连接"完成执行。我如何实现这一目标?

只是:

synchronized (this) { //////// }

或:

public ReentrantLock lock = new ReentrantLock();

public void reconnect() {

    lock.lock();

    ////

    lock.unlock();

}

很抱歉,如果已经提出这个问题。谢谢你的阅读。

增加1:

这是在评论中提到的,当一个方法,而不是"重新连接"正在执行,"重新连接"被称为,#34;重新连接"应该等到所有其他方法都完成执行。

2 个答案:

答案 0 :(得分:0)

取决于您的计划的复杂性。第一个适用于非常基本的任务。后者(Lock对象)是适用于更高级任务的高级并发对象的一部分。 Lock对象优于隐式锁定的最大优点是能够退出获取锁定的尝试。

答案 1 :(得分:0)

在Java 5.0版之前,只有第一个选项(或等效的synchronized方法修饰符)可用。第二个选项在5.0及更高版本中可用。

这两个是等价的,如果使用正确(你的第二个例子应该用try-finally块扩展)

第一种方法的缺点是您只能使用一个条件变量,否则使用它会更方便(并且不易出错)。

如果您想要多个条件变量,则必须使用第二种形式。