public class javaprac1 {
private javaprac1() {
}
static private javaprac1 instance = new javaprac1();
public static javaprac1 getInstance(){
return instance;
}
}
答案 0 :(得分:3)
是。这是一个非懒惰的单例,它是最简单的,并且是线程安全的,没有任何额外的诡计。唯一的“缺点”是它没有懒惰的初始化,但往往似乎懒得过分强调。当单例执行一些可能很重的初始化时,Lazy-init是首选,并且您希望将它推迟到第一次使用时。
如果您需要一个懒惰的单身,请使用Enum singleton模式,这也非常简单。
答案 1 :(得分:0)
如果你的意思是' ..停止单身.. ' - 答案是否。但如果您的意思是此代码线程安全' (我怀疑你的意思) - 答案是是。
更好/最新的方法将是ujsing single value enum singleton。其他答案真的很好。
谢谢你@kayaman,我今天学到了一些东西。
答案 2 :(得分:0)
是。 但至于你的方法(第一种方法),你可以让你的私人领域最终。
因此,对javaprac1.getInstance
的所有调用都返回相同的对象引用,并且不会创建其他javaprac1
实例
<强>例如强>
public class javaprac1 {
private javaprac1() {
}
static private final javaprac1 instance = new javaprac1();
public static javaprac1 getInstance(){
return instance;
}
}
对于第二种方法,请同时填写final
字段public
并进行调用。您无需创建getInstance
方法。
<强>例如强>
public class javaprac1 {
private javaprac1() {
}
static public final javaprac1 instance = new javaprac1();
}
对于第三种方法, Enum singleton - 首选方法(请参阅Effective Java- Item3)。
<强>例如强>
public enum javaprac1 {
INSTANCE;
}
答案 3 :(得分:0)
我问两个线程是否同时访问代码会创建两个对象。答案是我不相信人民给出的答案。
由于
答案 4 :(得分:-1)
如果你问的是你的实现是否是线程安全的,我会说它实际上是线程安全的
无论如何,我用这种方式将它与延迟初始化结合起来:
public class javaprac1 {
private javaprac1() {}
static private javaprac1 instance = null;
public static synchronized javaprac1 getInstance(){
if(instance == null){
instance = new javaprac1();
}
return instance;
}
}