单例模式(Singleton)
来源:互联网 发布:海康威视网络设置方法 编辑:程序博客网 时间:2024/06/04 18:14
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">单例模式保证在应用程序中只有一个实例,避免频繁实例化对象。</span>
public class Region { private Region(){ } private static Region region = null; private static Region getInstance(){ if(region==null){ region = new Region(); } return region; }}
首先构造函数要是私有的,避免被实例化(反射方式除外)。上例中,是一个简单的单例类,使用时直接调用Region.getInstance()即可。但是在多线程环境下不安全,会导致多次实例化。public class Region { private Region(){ } private static Region region = new Region(); private static Region getInstance(){ return region; }}
该方式是在系统启动的时候就初始化一个对象,虽然是线程安全的,但是并不推荐。我们最后做到在系统需要的时候再初始化,这样可以提高系统加载速度。public class Region { private Region(){ } private static Region region = null; private static Region getInstance(){ synchronized (Region.class){ if(region==null){ region = new Region(); } return region; } }}
该例子是线程安全的,我们使用了synchronized关键字,也是在需要的时候初始化对象,但是每次获取对象的时候都要排队获取对象,效率肯定会低很多,我们需要的时候只有第一次加锁
public class Region { private Region() { } private static Region region = null; private static Region getInstance() { if (region == null) { synchronized (Region.class) { if (region == null) { region = new Region(); } } } return region; }}
在该方法中,我们首先判断是否为空,如果为空再加锁进入,进入之后再判断是否为空,如果为空则实例化。实例化之后,再有线程获取对象就会直接获取实例化的对象,不需要经过锁了,效率提高很多,推荐这样写法。public class Region { private Region() { } private static Region region = null; private static class SinletonClass{ private static Region instance = new Region(); } private static Region getInstance() { return SinletonClass.instance; }}
这种模式是利用对象实例化线程安全的方式 获取对象的时候才在内部类实例化。强烈推荐这种用法!!!
0 0
- 单例(Singleton)模式
- singleton 单例模式
- Singleton单例模式
- Singleton(单例)模式
- Singleton 单例模式
- 单例模式(Singleton)
- 单例模式(Singleton)
- Singleton(单例)模式
- Singleton(单例)模式
- 单例模式(Singleton)
- 单例模式(Singleton)
- 单例模式Singleton
- Singleton (单例模式)
- Singleton单例模式
- 单例模式----SingleTon
- 单例模式-singleton
- 单例模式(Singleton)
- Singleton(单例模式)
- jquery插件treeTable
- 软件工程(二)----结构化开发
- JAVA程序员的发展道路和最终归宿
- 判断二叉树是否是完全二叉树
- POJ 2965 The Pilots Brothers' refrigerator
- 单例模式(Singleton)
- 第九周-单步执行程序
- 如何查看JDK以及JAVA框架的源码
- 服务器编程四
- 内存分配方式
- linux用户管理笔记
- DS-5 30天试用版许可证错误Error: C9932E: Cannot obtain license for Compiler
- 第九周 项目2:分数的累加
- java计算时间差及比较时间