假设我有一个带有方法 m 的类 X。方法 m NOT 是同步的,也不需要是因为它实际上并没有改变类型 X 的对象 x 的状态。
在某些线程中,我这样调用方法:x.m()。所有这些线程都使用同一个对象 x。
这个方法(方法m)可以同时在对象x上被多少个线程调用? 该方法被(比方说)100 个线程调用这一事实可能成为我的应用程序的瓶颈吗?
谢谢。
最佳答案
其他人已经回答了您的直接问题。
我想澄清一些可能你的误解……如果是,那它就是一个危险的东西。 p>
Method m is NOT synchronized and it doesn't need to be since it doesn't really change the state of the object x of type X.
这不是充分条件。不改变状态的方法通常也需要同步。
假设您有一个带有简单 getter 和 setter 的类 Test:
public class Test {
private int foo;
public int getFoo() {
return foo;
}
public synchronized void setFoo(int foo) {
this.foo = foo;
}
}
getter 是线程安全的吗?
- 根据你的规则,是的。
- 实际上,没有。
为什么?因为除非调用 getFoo
和 setFoo
的线程正确同步,否则在调用 setFoo(.. .)
可能会看到 foo
的陈旧值。
这是您几乎每次都能逃脱惩罚的恶劣案例之一。但是偶尔,这两个调用的时间安排会让你陷入困境。这种错误很可能会从您的测试漏洞中溜走,并且在生产中出现时很难重现。
唯一绝对不同步地从多个线程访问对象状态的情况是状态被声明为final
,并且构造函数没有发布对象。
关于java - 有多少个线程可以同时调用一个对象的非同步方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7092143/