这个 Java 代码是什么意思? 它会锁定 MyClass的所有对象吗?
MyClass
synchronized(MyClass.class) { //is all objects of MyClass are thread-safe now ?? }
以及上面的代码与这个代码的不同之处:
synchronized(this) { //is all objects of MyClass are thread-safe now ?? }
不,第一种方法会锁定 MyClass的类定义,而不是所有的实例。但是,如果在实例中使用,这将有效地阻塞所有其他实例,因为它们共享一个类定义。
The second will get a lock on the current instance only.
至于这是否使您的对象线程安全,这是一个更复杂的问题-我们需要看到您的代码!
代码片段 synchronized(X.class)使用类实例作为监视器。由于只有一个类实例(在运行时表示类元数据的对象) ,所以该块中可以有一个线程。
synchronized(X.class)
对于 synchronized(this),块由实例保护。对于每个实例,只有一个线程可以进入块。
synchronized(this)
synchronized(X.class)用于确保块中只有一个 Thread。synchronized(this)确保每个实例只有一个线程。如果这使得块中的实际代码线程安全取决于实现。如果仅改变实例 synchronized(this)的状态就足够了。
补充其他答案:
static void myMethod() { synchronized(MyClass.class) { //code } }
is equivalent to
static synchronized void myMethod() { //code }
还有
void myMethod() { synchronized(this) { //code } }
相当于
synchronized void myMethod() { //code }
是的(在任何同步块/函数上)。
这几天我一直在思考这个问题(实际上是在科特林)。我终于找到了合理的解释,并想与大家分享:
类级别锁阻止多个线程在运行时进入类的所有可用实例中的同步块。这意味着如果在运行时有100个 DemoClass 实例,那么一次只有一个线程能够在任何一个实例中执行 demoMethod () ,并且所有其他实例将被锁定用于其他线程。
类级别锁定应该始终进行,以确保静态数据线程的安全。正如我们所知道的,static 关键字将方法的数据关联到类级别,因此可以使用在静态字段或方法上的锁定使其位于类级别。
另外要注意为什么是 。类。因为 .class等价于类的任何静态变量,类似于:
.class
private final static Object lock = new Object();
where lock variable name is 同学们 and type is 类别 < T >
延伸阅读: https://howtodoinjava.com/java/multi-threading/object-vs-class-level-locking/