2013-05-04 55 views
1

如果我调用一个同步的对象,我可以访问该对象内的对象,就好像它们是同步的吗?或者我只能访问数据类型?同步会影响对象成员吗?

+3

你的问题非常模糊 - 你说的“调用同步对象”是什么意思?如果你想给出一个特定的代码示例,这真的很有帮助。 – 2013-05-04 07:37:53

回答

0

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

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

1

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

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

synchronized (myObject) { 
    // sensitive code 
} 

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

0

对每个对象的synchronize的能力在Java中是一个常见的烦恼,因为它很混乱。

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

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