Java的synchronized块进行的.class
-
20-09-2019 - |
题
这是什么java代码是什么意思?它将在MyClass
的所有对象增益锁定?
synchronized(MyClass.class) {
//is all objects of MyClass are thread-safe now ??
}
和如何上面的代码不同于这个之一:
synchronized(this) {
//is all objects of MyClass are thread-safe now ??
}
解决方案
在片断synchronized(X.class)
使用类实例作为监视器。由于只有一个类的实例(代表在运行时类的元数据的对象)一个线程可以是在该块中。
使用synchronized(this)
块由实例把守。对于每一个实例只有一个线程可以进入块。
synchronized(X.class)
用来确保有在块恰好一个线程。 synchronized(this)
确保有每个实例只有一个线程。如果这使得实际的代码块中的线程安全依赖于实现。如果实例synchronized(this)
的发生变异仅状态就足够了。
其他提示
要添加到其他的答案:
static void myMethod() {
synchronized(MyClass.class) {
//code
}
}
等同于
static synchronized void myMethod() {
//code
}
和
void myMethod() {
synchronized(this) {
//code
}
}
等同于
synchronized void myMethod() {
//code
}
没有,第一个将获得MyClass
的类定义,而不是它的所有实例的锁。然而,如果在一个实例中使用,这将有效地阻止所有其它情况下,因为它们共享一个单一的类定义。
在第二将获得当前实例的锁定只。
至于这是否让你的对象是线程安全的,这是一个更为复杂的问题 - 我们需要看到你的代码
不隶属于 StackOverflow