Java设计模式之单例模式

来源:互联网 发布:大数据涂子沛书籍下载 编辑:程序博客网 时间:2024/05/17 04:19

饿汉式单例

class MySingleton2 {    private static MySingleton2 mySingleton2 = new MySingleton2();    private MySingleton2() {    }    public static MySingleton2 getInstance(){        return mySingleton2;    }}

  饿汉式单例不存在线程安全问题:

public class Singleton {    public static void main(String[] args) {        for (int i = 0; i < 10; i++) {            new Thread(new Runnable() {                @Override                public void run() {                    System.out.println(MySingleton2.getInstance().hashCode());                }            }).start();        }    }}

  运行结果:
  
  image_1b8ulpveb1np72b24c01jg2n0q9.png-27.3kB
  

懒汉式单例

class MySingleton1 {    private static MySingleton1 mySingleton1 = null;    private MySingleton1() {    }    public static MySingleton1 getInstance() {        if (mySingleton1 == null) {            mySingleton1 = new MySingleton1();        }        return mySingleton1;    }}

  存在线程安全问题:

public class Singleton {    public static void main(String[] args) {        for (int i = 0; i < 10; i++) {            new Thread(new Runnable() {                @Override                public void run() {                    System.out.println(MySingleton1.getInstance().hashCode());                }            }).start();        }    }}

  运行结果:
  
  image_1b8ultjod11oh6sudodf9fcqmm.png-27.9kB
  
  改进方式1:使用同步方法或者同步块

class MySingleton1 {    private static MySingleton1 mySingleton1 = null;    private MySingleton1() {    }    public static synchronized MySingleton1 getInstance() {        if (mySingleton1 == null) {            mySingleton1 = new MySingleton1();        }        return mySingleton1;    }}
class MySingleton1 {    private static MySingleton1 mySingleton1 = null;    private MySingleton1() {    }    public static MySingleton1 getInstance() {        synchronized (MySingleton1.class) {            if (mySingleton1 == null) {                mySingleton1 = new MySingleton1();            }        }        return mySingleton1;    }}

  可以解决,运行结果如下:
  
  image_1b8um0ucc6orfq718fmcsa3eq1g.png-30.8kB
  
  但是效率太低。
  
  改进方式2:使用同步块锁定核心代码

class MySingleton1 {    private static MySingleton1 mySingleton1 = null;    private MySingleton1() {    }    public static MySingleton1 getInstance() {        if (mySingleton1 == null) {            synchronized (MySingleton1.class) {                mySingleton1 = new MySingleton1();            }        }        return mySingleton1;    }}

  不能解决问题,运行结果如下:
  
  image_1b8um9a8f1hk016fj1jo51gnd3po1t.png-28.6kB
  
  改进方式3:使用双检查锁机制(推荐)

class MySingleton1 {    private static MySingleton1 mySingleton1 = null;    private MySingleton1() {    }    public static MySingleton1 getInstance() {        if (mySingleton1 == null) {            synchronized (MySingleton1.class) {                if (mySingleton1 == null) {                    mySingleton1 = new MySingleton1();                }            }        }        return mySingleton1;    }}

  可以解决线程安全问题,并且效率较高,运行结果如下:
  
  image_1b8umd2qvbgb1mubhii1ntjqlf2a.png-27.9kB

0 0
原创粉丝点击