单例模式
单例模式是Java中最常用的模式之一,它通过阻止外部实例化和修改,来控制所创建的对象的数量。这个概念可以被推广到仅有一个对象能更高效运行的系统,或者限制对象实例化为特定的数目的系统中。例如:
- 私有构造函数 - 其他类不能实例化一个新的对象。
- 私有化引用 - 不能进行外部修改。
- 公有静态方法是唯一可以获得对象的方式
一个国家只能有一位总统(可能在正常情况下)。所以不管任何时候我们需要一位总统,使用AmericaPresident就能返回一个。getPresident()方法将确保只有一个总统对象被创建。否者,就不妙了
1 public class AmericaPresident { 2 3 private AmericaPresident() {} 4 5 private static final AmericaPresident thePresident=new AmericaPresident(); 6 7 public static AmericaPresident getPresident(){ 8 return thePresident; 9 } 10 }
单例模式的实现
1.双重校验锁,在当前的内存模式中无效
class Singleton{ private volatile static Singleton instance; private Singleton(){} public static Singleton getInstance(){ if(instance == null){ synchronized(Singleton.class){ if(instance == null){ instance = new Singleton(); } }
} return instance; } }
2.静态内部类。加载时不会初始化静态变量 INSTANCE 因为没有主动调用,达到了懒加载的效果
class Singleton{ private Singleton(){} private static class SingletonHolder{ private final static Singleton INSTANCE = new Singleton(); } public static Singleton getInstance(){ return SingletonHolder.INSTANCE; } }
3.饿汉
class Singleton{ private static Singleton instance = new Singleton(); private Singleton(){} public static Singleton getInstance(){ return instance; } }
4.懒汉(常用模式)
class Singleton{ private static Singleton instance; private Singleton(){} public static Singleton getInstance(){ if(instance == null){ instance = new Singleton(); } return instance; } }
单例模式在Java标准库中的使用
java.lang.Runtime#getRuntime() 是Java 标准库中常用的方法,它返回与当前Java应用关联的运行时对象。
下面是getRunTime() 的一个简单例子,它在windows系统上读取一个网页。
1 Process p = Runtime.getRuntime().exec( 2 "C:/windows/system32/ping.exe programcreek.com"); 3 4 //get process input stream and put it to buffered reader 5 BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream())); 6 String line; 7 while ((line = input.readLine()) != null) { 8 System.out.println(line); 9 } 10 input.close();
输出结果
Pinging programcreek.com [198.71.49.96] with 32 bytes of data: Reply from 198.71.49.96: bytes=32 time=53ms TTL=47 Reply from 198.71.49.96: bytes=32 time=53ms TTL=47 Reply from 198.71.49.96: bytes=32 time=52ms TTL=47 Reply from 198.71.49.96: bytes=32 time=53ms TTL=47 Ping statistics for 198.71.49.96: Packets: Sent = 4, Received = 4, Lost = 0 (0% loss), Approximate round trip times in milli-seconds: Minimum = 52ms, Maximum = 53ms, Average = 52ms