1

如果我调用一个对象同步,我可以访问该对象内的对象,就好像它们是同步的一样?还是我只能访问数据类型?

4

3 回答 3

1

尽管您的目标是保护数据,但同步提供了围绕代码块而不是数据块的排他性。同步块之外的代码(或使用不同对象的块中的代码)可能会更改您尝试保护的数据,即使这不是您想要的。

任何正确的锁定策略都必须确保可能相互干扰的代码块持有相同的锁定。这包括可能干扰在第二个线程中运行的另一个自身副本的代码。

synchronized (myObject) {
  // sensitive code
}

在方法级别锁定只是锁定this方法体指针的简写。(或class静态方法的对象)。

于 2013-05-04T07:43:30.277 回答
0

可能,但必须小心。如果您始终锁定同一个对象,则可以执行此操作。

很可能您必须锁定每个对象。

于 2013-05-04T07:35:38.510 回答
0

在每个对象上的能力synchronize是 Java 中一个常见的烦恼,因为它令人困惑。

基本上,这意味着每个对象都可以是一个锁。而已。因此,当您锁定父对象时,对对象的成员没有特殊影响,您使用哪个特定对象作为锁定并不重要。如果您的所有线程都锁定在同一个对象上,那么其中只有一个将运行/访问同步块中的任何代码。如果其中一些不这样做,则没有这样的保证。

如果您想确保在任何给定时间只有一个线程正在访问成员,请确保访问该成员的所有线程在访问同一对象之前锁定(或“同步”)同一对象。只要你这样做,你使用哪个对象来锁定都没有关系。

于 2013-05-04T07:45:39.577 回答