这个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 ??
}
这个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
,而不是它的所有实例。但是,如果在一个实例中使用,这将有效地阻止所有其他实例,因为它们共享一个类定义。
第二个将仅锁定当前实例。
至于这是否使您的对象线程安全,这是一个更复杂的问题——我们需要查看您的代码!
是的(在任何同步块/功能上)。
我为自己想了几天这个问题(实际上是在 kotlin 中)。我终于找到了很好的解释并想分享它:
类级锁可防止多个线程在运行时进入类的所有可用实例中的同步块。这意味着如果在运行时有 100 个 DemoClass 实例,那么一次只有一个线程能够在任何一个实例中执行 demoMethod(),而所有其他实例都将被其他线程锁定。
应始终进行类级别锁定以使静态数据线程安全。众所周知,静态关键字将方法的数据与类级别相关联,因此在静态字段或方法上使用锁定使其在类级别上。
另外要注意为什么.class。只是因为.class
它相当于类的任何静态变量,类似于:
private final static Object lock = new Object();
其中锁变量名称是类,类型是Class<T>
阅读更多: https ://howtodoinjava.com/java/multi-threading/object-vs-class-level-locking/