是否有选择特定对象的理由?

时间:2012-06-01 19:53:59

标签: java multithreading object synchronization

用于同步的锁定对象是否是任意的,或者是否有选择特定对象的原因?

5 个答案:

答案 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,或使用私有对象。