标签:
public class SingletonDemo01 {
/**
* 加载时就把对象创建出来--饿汉式
* 类初始化时天然的是线程安全的
*/
private static SingletonDemo01 instance=new SingletonDemo01();
private SingletonDemo01(){
}
//方法没有同步,调用效率高
public static SingletonDemo01 getInstance(){
return instance;
}
}
public class SingletonDemo02 {
/**
* 加载时就不把对象创建出来--懒汉式
* 类初始化时天然的是线程安全的
*/
private static SingletonDemo02 instance;
private SingletonDemo02(){
}
//方法同步,并发效率低(如果不同步,并发量高的时候可能创建多个对象)
public static synchronized SingletonDemo02 getInstance(){
if(instance==null){
instance=new SingletonDemo02();
}
return instance;
}
}
public class SingletonDemo03 {
private static SingletonDemo03 instance=null;
private SingletonDemo03(){
}
public static SingletonDemo03 getInstance(){
if(instance==null){
SingletonDemo03 ins;
synchronized (SingletonDemo03.class) {
ins=instance;
if(ins==null){
synchronized (SingletonDemo03.class) {
if(ins==null){
ins=new SingletonDemo03();
}
}
instance=ins;
}
}
}
return instance;
}
}
public class SingletonDemo04 {
private SingletonDemo04(){
}
//类加载的方式天然线程安全
private static class Singleton04ClassInStance{
//不存在同步问题,效率高
private static final SingletonDemo04 instance=new SingletonDemo04();
}
//调用的时候才去加载,延迟加载实现
public static SingletonDemo04 getInstance(){
return Singleton04ClassInStance.instance;
}
}
public enum SingletonDemo05 {
/**
* 这个枚举元素本身就是单例
*/
INSTANCE;
/**
* 还可以添加自己需要的操作
*/
public void singletonOpt(){
}
}
--主要:
① 饿汉式:线程安全,调用效率高,不可以延迟加载
② 懒汉式:线程安全,调用效率不高,可以延迟加载
-- 其他:
③ 双重锁:JVM底层内部模型原因,偶尔会出问题,不建议使用
④ 静态内部类:线程安全,调用效率高,可以延迟加载
⑤ 枚举式:线程安全,调用效率高,不可延迟加载。并且可以天然的防止反射和反序列化漏洞。
标签:
原文地址:http://www.cnblogs.com/jeyson/p/5888063.html