gpt4 book ai didi

java - synchronized(Singleton.class) 和 synchronized(obj) 的区别

转载 作者:行者123 更新时间:2023-11-29 03:23:30 26 4
gpt4 key购买 nike

使用下面两个版本的Singleton Classes有什么区别

首先我使用的是synchronized(Singleton.class)

在第二个我使用同步(Obj)//第一种类型 公共(public)类单例{

private static Singleton obj = null;

Singleton() {
}

public static Singleton getInstance() {

synchronized(Singleton.class){
if (obj == null) {
obj = new Singleton();
}
}
return obj;
}

//第二种

public class Singleton {

private static Singleton obj = null;

Singleton() {
}

public static Singleton getInstance() {

synchronized(obj){
if (obj == null) {
obj = new Singleton();
}
}
return obj;
}
}

最佳答案

主要区别是 synchronized(obj) 不会工作:第一次调用它时,objnull ,因此您将看到一个 NullPointerException

Demo on ideone.

另一方面,

Singleton.class 永远不会是 null,因此您可以使用它进行同步。然而,恶意代码可以执行一种攻击,让您的 getInstance 方法永远等待:他们所需要做的就是锁定您的 Singleton.class,并放置一个在那里无限等待。

针对这种攻击的常见防御措施是为您的锁使用单独的私有(private)静态对象,如下所示:

public class Singleton {

private static Singleton obj = null;
private static final Object syncRoot = new Object();

Singleton() {
}

public static Singleton getInstance() {
synchronized(syncRoot){
if (obj == null) {
obj = new Singleton();
}
}
return obj;
}
}

关于java - synchronized(Singleton.class) 和 synchronized(obj) 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22333514/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com