java单例模式
单例模式
- 单例模式的定义:
答:一个类只有一个实例,并且提供一个全局访问点。
- 为什么要使用单例模式?
答:有些类如线程、缓冲,这些只能有一个实例,多个实例会产生冲突,所以必须保证代码中只有一个实例,第一个解决方法就是声明一个全局变量,将对象赋值给全局变量,这缺点就是我们必须一开始就创建对象,但应该是在需要的时候才创建对象。该全局变量应该保持只有一份,并且对共享他的对象都是可见的,这也就是唯一性和全局访问点。而单例模式就能确保这点。
- 运行的原理:
答:通过声明一个自己本身的静态实例,构造器使用private修饰,通过静态方法返回。静态变量在程序中只有一个,确保了实例只有一个。并且构造器是私有的,其他类无法产生实例。
- 单例模式的具体实现分类:
答:懒汉,饿汉,双重检验锁,枚举,静态内部类
4.1 懒汉模式。
答:静态实例不进行实例化,在静态方法中进行实例化并且返回。加载时没有实例化对象,加载块,但在调用获取对象时,要实例化,速度较慢。懒汉模式:线程不安全,效率很低。
public class SingletonDemo1 {
private static SingletonDemo1 instance ;
private SingletonDemo1() {
}
public static SingletonDemo1 getInstance() {
if(instance==null){
instance=new SingletonDemo1 ();}
return instance;
}
}
4.2 饿汉模式。
答:静态实例进行实例化。在加载类时候就进行实例化。
public class SingletonDemo1 {
private static SingletonDemo1 instance=new SingletonDemo1 () ;
private SingletonDemo1() {
}
public static SingletonDemo1 getInstance() {
return instance;
}
}
4.3 静态内部类。
答:在静态内部类内定义静态实例,并且在内部类内进行实例化。只有在调用内部类的变量时,才会对静态实例进行加载实例化。相比于饿汉模式,可以设置一定的延时实例化。
public class SingletonDemo1 {
private static class Singletonholder{
private static final SingletonDemo1 instance=new SingletonDemo1 () ;}
private SingletonDemo1() {
}
public static SingletonDemo1 getInstance() {
return Singletonholder.instance;
}
}
4.4 枚举
4.5 双重检验锁
答:在懒汉的基础上,在静态方法中,使用双锁的办法判断来进行实例化。既能保证线程安全,又能不对性能引起太大影响。

浙公网安备 33010602011771号