用于同步的锁定对象是否是任意的,或者是否有选择特定对象的原因?
答案 0 :(得分:2)
你为什么要锁定一个物体?因为它是在各种线程之间共享的。这就是全部。实现锁定和线程的方式可能是困难的部分,而不是选择要锁定的对象。
答案 1 :(得分:2)
您最好使用一种更现代的锁定技术,其中大部分复杂性和陷阱已被删除/平滑。 Package java.util.concurrent.locks
将是一个良好的开端。
答案 2 :(得分:1)
你的问题还不清楚。
您可能将Semaphore对象称为锁。您可能也指同步对象。
1)信号量也可以是任意对象。它的目的是它可以用来在信号量中保存线程,直到其他线程释放它。
2)同步对象使其所有函数成为原子:如果一个线程在该对象上运行,另一个对象则等待完成它自己的函数。这通常是在内部使用信号量实现的。
信号量是用于解决同步问题的对象。
答案 3 :(得分:1)
锁定对象需要代表独占部分。
如果锁定整个对象意味着由一个线程专门使用它,则可以使用对象“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) {
}
}
}
小心锁定到复杂,你可能遇到死锁
答案 4 :(得分:1)
在接受的答案中,您选择的对象是任意的,只需确保正确使用它即可。但是,有些物体比其他物体更好。最好的做法是不要使用一些可以在锁定环境之外访问的对象 - 如果它是其他一些代码也可能决定在它上面进行同步,或者在它上面调用notify或者其他什么。因此,最好使用java.util.concurrent,或使用私有对象。