public class SingletonDemo { // 类初始化时,会立即加载该对象,线程天生安全,调用效率高 private static SingletonDemo singletonDemo = new SingletonDemo(); private SingletonDemo() { System.out.println("SingletonDemo初始化"); } public static SingletonDemo getInstance() { System.out.println("getInstance"); return singletonDemo; }}
public class SingletonDemo {
// 类初始化时,会立即加载该对象,线程天生安全,调用效率高
private static SingletonDemo singletonDemo = new SingletonDemo();
private SingletonDemo() {
System.out.println("SingletonDemo初始化");
}
public static SingletonDemo getInstance() {
System.out.println("getInstance");
return singletonDemo;
public class SingletonDemo { //类初始化时,不会初始化该对象,真正需要使用的时候才会创建该对象。 private static SingletonDemo singletonDemo; private SingletonDemo() { } public synchronized static SingletonDemo getInstance() { if (singletonDemo == null) { singletonDemo = new SingletonDemo(); } return singletonDemo; }}
//类初始化时,不会初始化该对象,真正需要使用的时候才会创建该对象。
private static SingletonDemo singletonDemo;
public synchronized static SingletonDemo getInstance() {
if (singletonDemo == null) {
singletonDemo = new SingletonDemo();
在实例化方法上加synchronzied,太影响运行效率,改为
public class SingletonDemo { private static SingletonDemo singletonDemo; private SingletonDemo() { } public synchronized static SingletonDemo getInstance() { if (singletonDemo == null) { synchronized(SingletonDemo.class){ // 这样对相率有所提升(好像有点问题,忘了在哪学的,存疑?) singletonDemo = new SingletonDemo(); } } return singletonDemo; }}
synchronized(SingletonDemo.class){ // 这样对相率有所提升(好像有点问题,忘了在哪学的,存疑?)
《Effective Java》中所推荐的方法
public class Singleton { private static class SingletonHolder { private static final Singleton uniqueInstance = new Singleton(); } private Singleton (){ } public static final Singleton getInstance() { return SingletonHolder.uniqueInstance; } }
public class Singleton {
private static class SingletonHolder {
private static final Singleton uniqueInstance = new Singleton();
private Singleton (){
public static final Singleton getInstance() {
return SingletonHolder.uniqueInstance;
? 枚举创建本质上就是一个单例,所以枚举可以达到单例的效果。枚举创建单例不仅可以防止反射来创建对象,还可以防止反序列化的方式创建对象。(枚举的使用,之后再开一篇,之前可能是环境的局限性,很少用到枚举的,需要恶补一下)
/使用枚举实现单例模式 优点:实现简单、枚举本身就是单例,由jvm从根本上提供保障!避免通过反射和反序列化的漏洞 缺点没有延迟加载public class User { public static User getInstance() { return SingletonDemo.INSTANCE.getInstance(); } private static enum SingletonDemo { INSTANCE; // 枚举元素为单例 private User user; private SingletonDemo() { user = new User(); } public User getInstance() { return user; } } public static void main(String[] args) { User u1 = User.getInstance(); User u2 = User.getInstance(); System.out.println(u1 == u2); }}
/使用枚举实现单例模式 优点:实现简单、枚举本身就是单例,由jvm从根本上提供保障!避免通过反射和反序列化的漏洞 缺点没有延迟加载
public class User {
public static User getInstance() {
return SingletonDemo.INSTANCE.getInstance();
private static enum SingletonDemo {
INSTANCE;
// 枚举元素为单例
private User user;
user = new User();
public User getInstance() {
return user;
public static void main(String[] args) {
User u1 = User.getInstance();
User u2 = User.getInstance();
System.out.println(u1 == u2);
public class SingletonDemo { private volatile SingletonDemo singletonDemo; // 加 volatile 避免重排序问题 private SingletonDemo() { } public SingletonDemo getInstance() { if (singletonDemo == null) { synchronized (SingletonDemo.class) { if (singletonDemo == null) { singletonDemo = new SingletonDemo(); // 多线程下可能会出现重排序的问题 } } } return singletonDemo; }}
private volatile SingletonDemo singletonDemo; // 加 volatile 避免重排序问题
public SingletonDemo getInstance() {
synchronized (SingletonDemo.class) {
singletonDemo = new SingletonDemo(); // 多线程下可能会出现重排序的问题
原文链接:http://www.cnblogs.com/kingning/p/11238267.html
本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728