【发布时间】:2013-05-04 07:32:39
【问题描述】:
如果我调用一个对象同步,我可以访问该对象内的对象,就好像它们是同步的一样?还是只能访问数据类型?
【问题讨论】:
-
您的问题非常模糊-“调用对象同步”是什么意思?如果你能给出一个具体的代码示例,那真的很有帮助。
标签: java multithreading thread-safety synchronized
如果我调用一个对象同步,我可以访问该对象内的对象,就好像它们是同步的一样?还是只能访问数据类型?
【问题讨论】:
标签: java multithreading thread-safety synchronized
尽管您的目标是保护数据,但同步提供了围绕代码块而非数据块的排他性。同步块之外的代码(或使用不同对象的块中的代码)可能会更改您尝试保护的数据,即使这不是您想要的。
任何正确的锁定策略都必须确保可能相互干扰的代码块持有相同的锁定。这包括可能干扰在第二个线程中运行的另一个自身副本的代码。
synchronized (myObject) {
// sensitive code
}
在方法级别锁定只是锁定方法主体的this 指针的简写。 (或者静态方法的 class 对象)。
【讨论】:
可能,但要小心。如果您始终锁定同一个对象,则可以这样做。
您很可能必须锁定每个对象。
【讨论】:
synchronize 在每个对象上的功能是 Java 中常见的烦恼,因为它令人困惑。
基本上,这意味着每个对象都可以是一个锁。而已。因此,当您锁定父对象时,对对象的成员没有特殊影响,您使用哪个特定对象作为锁并不重要。如果您的所有线程都锁定在同一个对象上,那么其中只有一个将运行/访问同步块中的任何代码。如果其中一些不这样做,则没有这样的保证。
如果您想确保在任何给定时间只有一个线程正在访问一个成员,请确保访问该成员的所有线程在访问之前锁定(或“同步”)同一对象。只要您这样做,您使用哪个对象来锁定都没有关系。
【讨论】: