public class Singleton {
//饿汉式
private static Singleton singleton = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return singleton;
}
@Override
public String toString(){
return "饿汉式";
}
}
public class Singleton2 {
//懒汉式
private static Singleton2 singleton = null;
private Singleton2(){
}
public static synchronized Singleton2 getInstance(){
if (singleton==null){
singleton = new Singleton2();
}
return singleton;
}
@Override
public String toString(){
return "我是懒汉式";
}
}
注意! 上面的懒汉式从代码可以发现, 如果多线程访问, 有可能出现问题: 如果一个线程进入条件判断if(singleton == null){}
且还未创建对象的时候又进来一个线程执行, 再次判断为空, 那么这两个线程就会创建两个对象, 那就不是我们要的单例模式了
public class Singleton3 {
//懒汉式
private static Singleton3 singleton = null;
private Singleton3(){
}
public static synchronized Singleton3 getInstance(){
if (singleton==null){
synchronized (Singleton3.class){
if (singleton==null){
singleton = new Singleton3();
}
}
}
return singleton;
}
@Override
public String toString(){
return "我是双重锁懒汉式";
}
}
public class TestSingleton {
public static void main(String[] args) {
//饿汉式
Singleton s = Singleton.getInstance();
System.out.println(s);
System.out.println("==========");
//懒汉式
Singleton2 s2 = Singleton2.getInstance();
System.out.println(s2);
System.out.println("==========");
//懒汉式针对多线程优化,双重锁懒汉式
Singleton3 s3 = Singleton3.getInstance();
System.out.println(s3);
}
}
懒汉式的特点是延迟加载 比如配置文件 采用懒汉式的方法
本文由 Alicyu 创作,如果您觉得本文不错,请随意赞赏
采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
原文链接:https://www.alicyu.com/archives/singleton
最后更新:2019-10-18 14:43:38
Update your browser to view this website correctly. Update my browser now