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
- Java单例类进阶
- java 进阶
- JAVA进阶
- java进阶
- java进阶
- java进阶
- java进阶
- java进阶
- java进阶
- Java进阶
- Java 进阶
- java进阶
- java进阶
- java进阶
- Java进阶
- java进阶
- java进阶
- java进阶
- 点评系统 Modoer v3.6 旗舰版手机WEB端加微信公众平台接口
- 有关博客的一些断想
- MySQL中查看自带的SQL模式
- java学习之异常
- Java接口(interface)
- Java单例类进阶
- 脏话过滤器
- sqlDataReader与 DataSet
- [2015-09-19 15:07:13 - LinearLayoutActivity] Unable to resolve target 'android-14'
- 中值滤波 Qt代码 内含OpenCV类
- POJ 1190 生日蛋糕
- weka学习—解决导入weka中文乱码
- LeetCode -- Binary Tree Inorder Traversal
- 调用deleteRowsAtIndexPaths没有刷新表格怎么办?