饿汉式单例类
饿汉式单例类在加载时单例对象已经被创建。代码如下:
/**
* 懒汉式单例
* @Author: Rick
* @Date: 2018/10/31 17:44
*/
public class EagerSingleton {
private static EagerSingleton eagerSingleton = new EagerSingleton();
private EagerSingleton(){};
public static EagerSingleton getEagerSingleton(){
return eagerSingleton;
}
}
懒汉式单例类
与饿汉式单例不一样的是,懒汉式单例在第一次创建时被实例化。
使用关键字synchronized,使用线程锁,实现单例模式,代码如下:
**
* 懒汉式单例
* @Author: Rick
* @Date: 2018/10/31 17:51
*/
public class LazySingleton {
private static LazySingleton lazySingleton = null;
private LazySingleton(){
}
//增加了线程锁,线程安全,但是增加了系统压力,使性能降低
synchronized public static LazySingleton getLazySingleton() {
if (lazySingleton == null) {
lazySingleton = new LazySingleton();
}
return lazySingleton;
}
}
在类上添加关键字synchronized,进行单例实现,得到了线程安全,但每次都要进行线程锁的判断,在多线程高并发的访问环境中,导致系统的性能大大降低。getLazySingleton()方法修改为:
public static LazySingleton getLazySingleton(){
if(lazySingleton == null){
synchronized (LazySingleton.class){
lazySingleton = new LazySingleton();
}
}
return lazySingleton;
}
问题:这种方式不能实现单例,在第一个请求到达时,会创建对象,如果此时有第二个调用该方法,就会在线程锁外等待,当第一个请求创建对象完成后,第二个请求处于等待的状态,会再创建一个对象,所以这种写法无法实现单例。
使用双重检查锁定实现懒汉式的单例类的完整代码如下:
public static LazySingleton getLazySingleton(){
if(lazySingleton == null){
synchronized (LazySingleton.class){
if(lazySingleton == null) {
lazySingleton = new LazySingleton();
}
}
}
return lazySingleton;
}
静态内部类单例
饿汉式单例不能实现延迟加载,不论将来使用与否都会占用内存;懒汉式单例类线程安全控制繁琐,影响系统性能。可见无论是哪个都存在一些问题。使用静态内部类来实现单例,可以解决以上问题,代码如下:
/**
* 内部类实现单例
* @Author: Rick
* @Date: 2018/10/31 18:25
*/
public class InternalSingleton {
private InternalSingleton(){
}
private static class HolderClass{
/**内部类中进行实例化*/
private final static InternalSingleton INTERNALSINGLETON = new InternalSingleton();
}
public static InternalSingleton getHolderClass() {
return HolderClass.INTERNALSINGLETON;
}
public static void main(String[] args) {
InternalSingleton internalSingleton1,internalSingleton2;
internalSingleton1 = InternalSingleton.getHolderClass();
internalSingleton2 = InternalSingleton.getHolderClass();
System.out.println(internalSingleton1 == internalSingleton2);
}
}