设计模式:设计模式是在大量的实践中总结和理论化后优选的代码结构、编程风格、以及解决问题的思考方式。
一共有23种设计模式。
单例的设计模式:
1、解决的问题:使得一个类只能够创建一个对象。
2、如何实现?见如下四步
//饿汉式1
public class TestSingleton {
public static void main(String[] args) {
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
System.out.println(s1 == s2);//true,说明这两个引用的地址是一样的
}
}
//只能创建Singleton的单个实例
class Singleton{
//1、私有化构造器,使得在类的外部不能够调用此构造器
private Singleton(){
}
//2、在类的内部创建一个类的实例
//3、私有化此对象,通过公共的方法来调用
private static Singleton instance = new Singleton();
//4、此公共的方法,只能通过类来调用,因为设置为static的,同时类的实例也必须为static声明的
public static Singleton getInstance(){
return instance;
}
}
//饿汉式2
... ...
//2、在类的内部创建一个类的实例,与1的区别是是通过代码块实例化类的。
private static Singleton instance = null;
static {
instance = new Singleton();
}
//懒汉式:可能存在线程安全问题
public class TestSingleton1 {
public static void main(String[] args) {
Singleton1 s1 = Singleton1.getInstance();
Singleton1 s2 = Singleton1.getInstance();
System.out.println(s1 == s2);//true
}
}
class Singleton1{
//1.
private Singleton1(){
}
//2.
private static Singleton1 instance = null;
//3.
public static Singleton1 getInstance(){
if (instance == null){
instance = new Singleton1();
}
return instance;
}
}
为什么懒汉式可能存在线程安全问题?
因为假如有多个执行路径在调用getinstance()方法,当第一个执行路径由于首次执行getinstance方法,instance==null,进入if循环,但是由于当前执行的路径比较多,进行了CPU切换,该进程被挂起。另外一个执行路径开始执行,此时依旧instance==null,然后创建了instance对象(0x1111),返回instance;然后切换到第一个执行路径继续执行,便接着new一个新的对象(0x2222);但是这两个引用本身应该指向同一个对象,此时便出现线程问题。
网友评论