用于同步的锁定对象是任意的,还是选择特定对象的原因?
5 回答
您最好使用一种更现代的锁定技术,其中大部分复杂性和陷阱已被消除/平滑。包 java.util.concurrent.locks
将是一个好的开始。
为什么要锁定对象?因为它在各个线程之间共享。这就是全部。与选择要锁定的对象相比,如何实现锁定和线程可能是困难的部分。
你的问题比较不清楚。
您可能将 Semaphore 对象称为锁。您可能还指的是同步对象。
1) 信号量也可以是任意对象。它的预期目的是它可以用来在信号量处保存线程,直到其他线程释放它。
2) 同步对象使它们的所有功能都原子化:如果一个线程正在对该对象进行操作,则另一个对象等待完成自己的功能。这通常在内部使用信号量来实现。
信号量是用于解决同步问题的对象。
正如在接受的答案中一样,您选择的对象是任意的,只要确保您正确使用它即可。但是,有些对象比其他对象更好。最佳做法是不要使用在锁定上下文之外可以访问的某些对象 - 如果它是其他一些代码也可能决定对其进行同步,或者对其调用 notify 等。所以最好使用 java.util.concurrent 代替,或者使用私有对象。
锁定对象需要表示独占部分。
如果您锁定整个对象意味着由一个线程独占使用它,您可以使用对象“this”来锁定。这就是方法工作的“同步”工作方式。
public class A
{
public synchronized void do1 ()
{
...
}
public synchronized void do2 ()
{
...
}
}
如果您的对象只有一组应该专门使用的成员,您需要单独的(显式)锁定对象
public class B
{
private X x;
private Y y;
private Object lockXY = new Object ();
private R r;
private S s;
private Object lockRS = new Object ();
public void do1 ()
{
synchronize (lockXY) {
}
...
}
public void do2 ()
{
synchronize (lockRS) {
}
}
}
注意使锁定变得复杂,您可能会遇到死锁