几种实现单例模式的方法比较

新手,初次学习,感觉有所领会,如有不足或者理解偏差,请指正。

2018412

10:13

注意要点

    1.一个私有的静态变量

    2.一个私有的构造器

    3.一个公有的静态方法

·        普通构造器

package singleton;

public class CommonSingleton {
	private static CommonSingleton instance;//一个静态变量
	private CommonSingleton() {    // 一个私有的构造器
	}
	public static CommonSingleton getSingleton(){//一个静态方法
		if(instance==null){
			instance=new CommonSingleton();
		}
		return instance;
	}
}


·        带有同步锁的构造器

1.因为多线程并发访问时有可能导致创建的实例并不单一(只在初次创建实例的时候会引发这个问题),所以同步锁的作用就是每次只允许一个线程对该方法的访问,保证了单例,但由于创建实例只有一次,同步锁却每次访问都起作用,所以也很大程度限制了多线程的执行效率,使性能降低。

package singleton;

public class SynchronizedSingleton {
	private static SynchronizedSingleton instance;
	private SynchronizedSingleton() {
	}
	public static synchronized SynchronizedSingleton getSingleton(){
		if(instance==null){   
			instance=new SynchronizedSingleton();
		}
		return instance;
	}
}

·        初始化创建

在jvm加载此类的时候就马上创建实例,好处是解决了多线程可能重复创建实例的问题,不过这增加了应用程序初始化过程中的负担(对于需要初始化负担不重的程序很适用)

package singleton;

public class InitSingleton {
	private static InitSingleton instance=new InitSingleton();
	private InitSingleton() {
	}
	public static InitSingleton getSingleton(){
		return instance;
	}
	
}

·        双重检查锁

对于既要解决多线程访问可能导致单例重复创建问题,又不想直接加锁(导致并发时性能降低),而且初始化时创建又占用系统初始化资源,所以这是一个适合的解决办法。

package singleton;

public class DoubleCheckSingleton {
	private volatile static DoubleCheckSingleton instance;
	private DoubleCheckSingleton() {
	}
	public static DoubleCheckSingleton getSingleton(){
		if(instance==null){
			synchronized (DoubleCheckSingleton.class) {
				if(instance==null){
					instance=new DoubleCheckSingleton();
				}
			}
		}
		return instance;
	}
}

猜你喜欢

转载自blog.csdn.net/zhen921/article/details/79910799
今日推荐