1.请问Singleton2,和Singleton3的是否相同,
2.另外Singleton3中的语句"static { instance = new Singleton3(); }",在java中的术语叫什么,
我自己从语句理解为静态匿名方法,不过查了许多书好象没有此叫法吧????,(本人刚学java对一些语法和术语不太了解)3.网上的许多文章都说Singleton2的实现比较安全(多线程中),不过我想如果有多个线程同时定义
Singleton2,如 线程1代码中 有Singleton2 s1的代码,同时线程2代码中也有Singleton2 s2,这种
情况下JVM会如何处理
public class Singleton1 {
private static Singleton1 instance = null; private Singleton1() {
}; public static synchronized Singleton1 getInstance() {
if (instance == null)
instance = new Singleton1();
return instance;
}
}public class Singleton2 {
private Singleton2() {
} private static Singleton2 instance = new Singleton2(); public static Singleton2 getInstance() {
return instance;
}}public class Singleton3 {
private Singleton3() {
} static Singleton3 instance; public static Singleton3 getInstance() {
return instance;
}
static { instance = new Singleton3(); }
}
2,静态代码段
3,同进程线程共享。
OVER
2.静态代码段,装载类的时候就直接执行了
3.不管几个线程,instance 只有一个
我不太明白:Singleton2的实现为什么比较安全
第一种方法称为延迟构造或者懒汉构造,也就是只有调用getInstance()的时候才会构造实例。
这种方法的缺点就是为了线程安全,getInstance()使用了synchronized,降低了性能.
第二种方法(与第三种方法是一样的)就相对美观一些,并且没有synchronized,性能优化一些.推荐如下方法:
public class Singleton4{
private Singleton4(){}
private static class Inner{
static Singleton4 instance=new Singleton4();
}
public static Singleton4 getInstance(){
return Inner.instance;
}
}
既省略了synchronized,又实现了延迟构造
public final class Singleton4{
private Singleton4(){}
private static class Inner{
static final Singleton4 instance=new Singleton4();
}
public static Singleton4 getInstance(){
return Inner.instance;
}
}