同步会影响对象成员吗?

时间:2013-05-04 07:32:39

标签: java multithreading thread-safety synchronized

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

3 个答案:

答案 0 :(得分:1)

即使您的目标是保护数据,同步也会在代码块周围提供排他性,而不是一段数据。同步块之外的代码(或使用不同对象的块中的代码)可能会改变您尝试保护的数据,即使这不是您想要的。

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

synchronized (myObject) {
  // sensitive code
}

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

synchronize对每个对象的能力是Java中常被引用的烦恼,因为它令人困惑。

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

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