单例模式(Java)
下面是关于我所写的所有设计模式代码(还是建议自己手打或者想一个别的例子练习一次)
(https://github.com/lihang212010/DesignPatterns-/tree/master/designpatterns/src)
单例模式,保证一个类只能有一个实例对象,并提供访问此对象的方法。
单例模式分为饿汉式和懒汉式。
一般情况下我们多用饿汉式,懒汉式有线程问题使用少于饿汉式
饿汉式
public class Singleton {
private Singleton(){}
private static Singleton singleton=new Singleton();
public static Singleton getSingleton() {
return singleton;
}
}
public class Main {
public static void main(String[] args) {
Singleton s1=Singleton.getSingleton();
Singleton s2=Singleton.getSingleton();
System.out.print(s1==s2);
}
}
结果是true.
饿汉式是在加载这个类时就实例化,封闭创造自己对象的构造方法,提供一个外部获得对象的方法 getSingleton。
懒汉式
private Singleton1(){}
private static Singleton1 singleton;
public static Singleton1 getSingleton() {
if(singleton==null) {
synchronized (Singleton1.class) { //加锁防止被同步访问
if(singleton==null) { //双重锁保证线程安全
singleton=new Singleton1();
}}
}
return singleton;
}
}
public class Main {
public static void main(String[] args) {
Singleton1 s1=Singleton1.getSingleton();
Singleton1 s2=Singleton1.getSingleton();
System.out.print(s1==s2);
}
}
懒汉式是使用后在实例化对象,因为有可能别2个线程同时访问,这样就会出现2个实例话对象,因此需要加锁,但是因为JVM存在乱序行为,这种写法也不稳定,
可以private volatile static Singleton1 singleton=null;来防止JVM乱序,但是会牺牲一些内存