0

用于同步的锁定对象是任意的,还是选择特定对象的原因?

4

5 回答 5

2

您最好使用一种更现代的锁定技术,其中大部分复杂性和陷阱已被消除/平滑。 java.util.concurrent.locks将是一个好的开始。

于 2012-06-01T20:08:10.260 回答
2

为什么要锁定对象?因为它在各个线程之间共享。这就是全部。与选择要锁定的对象相比,如何实现锁定和线程可能是困难的部分。

于 2012-06-01T19:56:02.787 回答
1

你的问题比较不清楚。

您可能将 Semaphore 对象称为锁。您可能还指的是同步对象。

1) 信号量也可以是任意对象。它的预期目的是它可以用来在信号量处保存线程,直到其他线程释放它。

2) 同步对象使它们的所有功能都原子化:如果一个线程正在对该对象进行操作,则另一个对象等待完成自己的功能。这通常在内部使用信号量来实现。

信号量是用于解决同步问题的对象。

于 2012-06-01T20:07:58.313 回答
1

正如在接受的答案中一样,您选择的对象是任意的,只要确保您正确使用它即可。但是,有些对象比其他对象更好。最佳做法是不要使用在锁定上下文之外可以访问的某些对象 - 如果它是其他一些代码也可能决定对其进行同步,或者对其调用 notify 等。所以最好使用 java.util.concurrent 代替,或者使用私有对象。

于 2012-06-01T20:54:41.797 回答
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) {
       }
    }
 } 

注意使锁定变得复杂,您可能会遇到死锁

于 2012-06-01T20:09:46.730 回答