单例模式--java15(11/12/2015)

设计模式:设计模式是在大量的实践中总结和理论化后优选的代码结构、编程风格、以及解决问题的思考方式。

一共有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);但是这两个引用本身应该指向同一个对象,此时便出现线程问题。

你可能感兴趣的:(单例模式--java15(11/12/2015))