我不知道这个问题是否多余,但我在找了2个小时后找到答案......
我试图创建一个使用多个线程和一个类的共享实例的程序。当调用此实例上的某个方法时,让我们调用它"重新连接",其他方法调用应等到"重新连接"完成执行。我如何实现这一目标?
只是:
synchronized (this) { //////// }
或:
public ReentrantLock lock = new ReentrantLock();
public void reconnect() {
lock.lock();
////
lock.unlock();
}
很抱歉,如果已经提出这个问题。谢谢你的阅读。
增加1:
这是在评论中提到的,当一个方法,而不是"重新连接"正在执行,"重新连接"被称为,#34;重新连接"应该等到所有其他方法都完成执行。
答案 0 :(得分:0)
取决于您的计划的复杂性。第一个适用于非常基本的任务。后者(Lock对象)是适用于更高级任务的高级并发对象的一部分。 Lock对象优于隐式锁定的最大优点是能够退出获取锁定的尝试。
答案 1 :(得分:0)
在Java 5.0版之前,只有第一个选项(或等效的synchronized
方法修饰符)可用。第二个选项在5.0及更高版本中可用。
这两个是等价的,如果使用正确(你的第二个例子应该用try-finally块扩展)
第一种方法的缺点是您只能使用一个条件变量,否则使用它会更方便(并且不易出错)。
如果您想要多个条件变量,则必须使用第二种形式。