Java单例类进阶

来源:互联网 发布:淘宝登录不上怎么找回 编辑:程序博客网 时间:2024/05/17 21:49

Java单例类的基本实现:

public class Singleton { private Singleton(){ <span style="white-space:pre"></span>System.out.println("Singleton is create"); } private static Singleton instance = new Singleton(); public static Singleton getInsatnce(){ <span style="white-space:pre"></span>return instance; }}

但是这种基本实现方法,在JVM加载这个单例类时,单例对象就会被创建,造成一定的浪费。

为避免上述问题,就有了延迟加载的方式:

public class Singleton{     private static Singleton instance = null;     public static synchronized Singleton getInstance(){            if(instance == null){                    instance = new Singleton();            }            return instance;     }}

延迟加载的getInstance()方法有必要加上synchronized关键字,否则在多线程的情况下容易出现多个实例。

添加synchronized关键字后,会使运行速度变慢,所以有了另外一种解决同步关键字低效率:

public class Singleton { private Singleton(){ System.out.println("Singleton is create"); }  public static Singleton getInsatnce(){ return SingletonHolder.instance; }  public static void createString(){ System.out.println("createString in Singleton"); }  private static class SingletonHolder{ private static Singleton instance = new Singleton(); }  }

使用内部类来维护单例的实例化,只有在调用getInstance()方法时,才会加载SIngletonHolder类。同时实例的建立是在加载时完成,对线程友好。


通过测试,似乎效果不错,测试代码:

public class Singleton {private int count = 0; private Singleton(){ System.out.println("Singleton is create"); }  public static Singleton getInsatnce(){ return SingletonHolder.instance; }  public static void createString(){ System.out.println("createString in Singleton"); }  private static class SingletonHolder{ private static Singleton instance = new Singleton(); }  public int countAdd(){ count++; return count; } }

import java.text.SimpleDateFormat;import java.util.Date;public class Main implements Runnable{private static int count = 0;public static void main(String[] args) {// TODO Auto-generated method stubfor(int i=0 ;i<5;i++){new Thread(new Main()).start();}}@Overridepublic void run() {// TODO Auto-generated method stubfor(int i=0; i< 10; i++){Singleton singleton = Singleton.getInsatnce();SimpleDateFormat df = new SimpleDateFormat("yyyy-mm-dd HH:MM:SS");System.out.println(df.format(new Date())+": "+singleton.countAdd());}}}

输出结果:

Singleton is create2015-59-19 15:09:224: 22015-59-19 15:09:224: 52015-59-19 15:09:224: 42015-59-19 15:09:225: 62015-59-19 15:09:225: 72015-59-19 15:09:224: 32015-59-19 15:09:224: 12015-59-19 15:09:225: 92015-59-19 15:09:225: 102015-59-19 15:09:226: 112015-59-19 15:09:226: 122015-59-19 15:09:226: 132015-59-19 15:09:226: 142015-59-19 15:09:225: 162015-59-19 15:09:226: 172015-59-19 15:09:225: 82015-59-19 15:09:226: 192015-59-19 15:09:225: 72015-59-19 15:09:226: 202015-59-19 15:09:227: 212015-59-19 15:09:227: 232015-59-19 15:09:227: 242015-59-19 15:09:227: 252015-59-19 15:09:227: 262015-59-19 15:09:226: 182015-59-19 15:09:227: 272015-59-19 15:09:226: 152015-59-19 15:09:228: 282015-59-19 15:09:227: 272015-59-19 15:09:228: 302015-59-19 15:09:228: 312015-59-19 15:09:228: 322015-59-19 15:09:227: 222015-59-19 15:09:229: 342015-59-19 15:09:228: 332015-59-19 15:09:229: 362015-59-19 15:09:228: 292015-59-19 15:09:229: 382015-59-19 15:09:229: 392015-59-19 15:09:230: 402015-59-19 15:09:230: 412015-59-19 15:09:230: 422015-59-19 15:09:229: 372015-59-19 15:09:230: 432015-59-19 15:09:229: 352015-59-19 15:09:232: 442015-59-19 15:09:232: 452015-59-19 15:09:232: 462015-59-19 15:09:232: 472015-59-19 15:09:233: 48

以上部分内容来自:https://www.ibm.com/developerworks/cn/java/j-lo-Singleton/

0 0
原创粉丝点击