- 浏览: 124261 次
- 性别:
- 来自: 地球
文章分类
最新评论
-
754731046:
很适合对初学者适用,谢谢
Oracle存储过程详解 -
天明破晓:
我测试了,不好用
Java中的正则表达式验证各种电话号码 -
OracleX:
otom31 写道从来不用标签库,几乎不用struts,除了最 ...
标签库的优点、缺点大辩论 -
otom31:
从来不用标签库,几乎不用struts,除了最早公司要使用以外; ...
标签库的优点、缺点大辩论
单例模式应用于一个类只有一个实例的情况,并且为其实例提供一个全局的访问点。
特点:
1.一个类只有一个实例
2.自己创建这个实例
3.整个系统只能用这个实例
应用场景
外部资源:每台计算机有若干个打印机,但只能有一个PrinterSpooler,以避免两个打印作业同时输出到打印机。
内部资源:大多数软件都有一个(或多个)属性文件存放系统配置,这样的系统应该有一个对象管理这些属性文件。
实现方式
1.饿汉式:单例实例在类装载时就构建,急切初始化。(预先加载法)
/** * 饿汉式(推荐) * */ public class Singleton1 { private Singleton1() { } public static Singleton1 instance = new Singleton1(); public Singleton1 getInstance() { return instance; } }
优点 | 1.线程安全
2.在类加载的同时已经创建好一个静态对象,调用时反应速度快 |
缺点 | 资源效率不高,可能getInstance()永远不会执行到,但执行该类的其他静态方法或者加载了该类(class.forName),那么这个实例仍然初始化 |
2.懒汉式:单例实例在第一次被使用时构建,延迟初始化。
class Singleton2 { private Singleton2() { } public static Singleton2 instance = null; public static Singleton2 getInstance() { if (instance == null) {
//多个线程判断instance都为null时,在执行new操作时多线程会出现重复情况 instance = new Singleton2(); } return instance; } }
懒汉式在单个线程中没有问题,但在多线程就可能会出现两个或多个Singleton2实例情况,
虽然后面实例化的Singleton2会覆盖前面实例化的Singleton2,但最好避免这样的情况。
改进方式就是加锁synchornized
class Singleton3 { private Singleton3() { } public static Singleton3 instance = null; public static synchronized Singleton3 getInstance() { if (instance == null) { instance = new Singleton3(); } return instance; } }
优点 | 资源利用率高,不执行getInstance()就不会被实例,可以执行该类的其他静态方法 |
缺点 | 第一次加载时不够快,多线程使用不必要的同步开销大 |
3.双重检测
class Singleton4 { private Singleton4() { } public static Singleton4 instance = null; public static Singleton4 getInstance() { if (instance == null) { synchronized (Singleton4.class) { if (instance == null) { instance = new Singleton4(); } } } return instance; } }
优点 | 资源利用率高,不执行getInstance()就不被实例,可以执行该类其他静态方法 |
缺点 | 第一次加载时反应不快,由于java内存模型一些原因偶尔失败 |
4.静态内部类
class Singleton5 { private Singleton5() { } private static class SingletonHelp { static Singleton5 instance = new Singleton5(); } public static Singleton5 getInstance() { return SingletonHelp.instance; } }
优点 | 资源利用率高,不执行getInstance()不被实例,可以执行该类其他静态方法 |
缺点 | 第一次加载时反应不够快 |
总结:一般采用饿汉式(1),若对资源十分在意可以采用静态内部类(4),不建议采用懒汉式及双重检测(2、3)
另外
对于第二种可以采用volatile方式
volatile用更低的代价代替同步
解释:同步的代价主要有覆盖范围决定,如果可以降低同步的覆盖范围,可大幅提升性能。
而volatile覆盖范围是变量级别的,因此同步代价很低。
volatile原理:告诉处理器,不要将其放入工作内存,而是直接在主存操作。因此,当多处理器或多线程在访问该变量时
都将直接操作主存,这在本质上做到了变量共享。
volation优势:
1.更大的程度吞吐量
2.更少的代码实现多线程
3.程序伸缩性好
4.比较好理解,无需太高的学习成本
volatile不足:
1.容易出问题
2.比较难设计
参考文献
http://yiminghe.iteye.com/blog/404334
http://developer.51cto.com/art/201103/249322.htm
发表评论
-
AOP的实现(JDK动态代理)
2011-11-29 16:21 1008转自:http://www.blogjava.net/D ... -
短信平台总结(20111128)
2011-11-28 17:49 1web层套用公司框架,虽然struts1多少懂点了, ... -
Java 枚举7常见种用法
2011-11-27 22:54 897转自:http://helloyesyes.itey ... -
一个Java程序员应该掌握的10项技能
2011-11-18 11:57 10251、语法:必须比 ... -
Java回调函数使用
2011-08-16 16:14 725正常情况下开发人员使用已经定义好的API,这个过程叫 ... -
为什么要设置Java环境变量(详解)
2011-08-17 21:40 687从大二开始接触Java,之后是断断续续的学习。大三真正开始 ... -
很长空格的String转换成Array数组
2011-08-23 14:40 1303开发中碰到了一个需求,需要把键值对字符串分隔,但键值之 ... -
不同格式的日期字符串转换
2011-08-23 14:44 961先把字符串日期转换成对应的格式,然后再转换成日期 p ... -
用序列化(Serializable)保存、读取对象
2011-08-23 15:33 875实现Serializable借口的对象可以被转换成一系列 ... -
JUint测试
2011-08-23 15:36 665ClassA.java public class Cla ... -
Java连接数据库方式大全
2011-08-23 15:49 871Mysql: String Driver=& ... -
解决Join方法的疑惑
2011-08-23 20:57 1016很长时间对join方法感到疑惑,不明白到底是谁要阻塞,谁要继 ... -
线程学习笔记【1】----进程、线程概念及创建线程
2011-08-27 22:33 8101.进程与线程 每个进程都独享一块内存空间,一个应用程 ... -
线程学习笔记【2】---Timer(定时器)
2011-08-28 09:15 787入门 public class Time01 { ... -
线程学习笔记【3】---互斥技术
2011-08-29 15:10 758第一个示例更多的是运用了内部类的特性: 内部类重要特点:可以 ... -
线程学习笔记【4】---线程之间通信
2011-08-29 17:31 756子线程先循环10次,然后主线程循环100次,再子线程循环10次 ... -
线程学习笔记【5】--ThreadLocal应用
2011-09-05 15:31 805基本的ThreadLocal使用 public clas ... -
Ant学习实例
2011-09-14 22:03 8121.安装Ant 先从http://ant.apache.or ... -
各种文件注释写法
2011-09-30 15:52 1269JSP注释 在JSP中注释最好用< ... -
敲回车光标跳到下一个输入框(只能在IE中使用)
2011-10-08 10:22 1768<html> <head> & ...
相关推荐
1. **线程安全**:在高并发环境下,必须注意单例模式的线程同步问题,避免多个线程同时创建实例导致的不一致性。 2. **对象复制问题**:需要防止通过序列化或反射机制创建额外的实例,这可能破坏单例模式的一致性。 ...
总结起来,Java中的单例模式有多种实现,每种都有其优缺点。开发者应根据项目需求选择适合的实现方式,比如对性能要求较高的场景可以选择静态内部类或枚举,而对内存占用敏感的场景则可能更适合饿汉式。通过学习和...
单例模式的缺点: 1. **系统开销**:虽然单例模式可以减少不必要的对象创建,但在某些情况下,过度依赖单例可能会增加系统的复杂性和内存占用,尤其是在大型项目中。 2. **开发混淆**:由于隐藏了实例化的细节,...
然而,单例模式也有一些缺点: - 打破了单一职责原则,因为单例类不仅要处理业务逻辑,还要管理自己的实例化。 - 单例模式难以进行单元测试,因为它没有公共的构造函数,使得模拟对象变得困难。 - 难以解耦,单例...
**饿汉式**:在类加载时就完成了初始化,所以没有线程安全问题,但是不管是否使用,都会立即创建单例对象,这可能造成资源的浪费。例如: ```java class DanLi{ private static final DanLi obj = new DanLi(); ...
在Java中,实现单例模式有多种方法,每种都有其特定的优缺点和适用场景。以下是几种常见的单例模式实现方式: 1. **饿汉式(静态常量)**: 这是最简单的实现方式,它在类加载时就完成了初始化,因此是线程安全的...
单例模式是软件设计模式中的一种经典模式,其主要...总结起来,单例模式有多种实现方式,每种方式都有其适用场景和优缺点。在实际应用中,开发者应根据项目需求选择合适的单例实现,并注意线程安全和反序列化等问题。
单例模式是软件设计模式中的一种,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下都非常有用,比如控制资源的唯一性、管理共享配置或者创建昂贵的对象时避免频繁创建销毁。 ...
在C++中,实现单例模式有多种方法,我们将会深入探讨这一模式的原理、优缺点以及如何在实际编程中应用。 单例模式的核心在于控制类的实例化过程,防止多处代码创建多个实例导致资源的浪费或者状态不一致的问题。在...
以上就是单例模式的常见实现方式,每种都有其适用场景和优缺点。在实际开发中,应根据项目需求和环境选择合适的单例模式实现。在设计模式中,单例模式不仅限于上述实现,还可以与其他模式结合使用,如工厂模式、装饰...
#### 三、单例模式的创建方式及优缺点 单例模式的实现方式主要有三种:饿汉式、懒汉式以及静态内部类方式。 - **饿汉式** - **实现**: ```java public class Single1 { // 创建一个静态的实例 private ...
4. **单例模式的缺点**: - 反对依赖注入:由于单例模式控制了实例化过程,使得外部难以替换或模拟这个类的实例,不利于单元测试和解耦。 - 延迟加载:单例模式往往在第一次调用`getInstance()`时就创建了实例,...
懒汉式单例是在使用时才创建实例的单例模式。这种方式的优点是避免了无用的创建过程,但缺点是需要加锁以保证线程安全。 ```java public class Singleton { // 私有的默认构造子 private Singleton() {} // 已经...
### 三、单例模式的应用场景与优缺点 **应用场景**: - 全局日志对象 - 数据库连接池 - 缓存服务 - 线程池 - 多线程环境下的线程同步控制 **优点**: - 节省内存空间,减少系统资源消耗。 - 避免对资源的多重占用...
每种实现方式都有其优缺点,选择哪种方式取决于特定的应用场景,如性能需求、线程安全性和代码简洁性等因素。单例模式虽然方便,但过度使用可能导致设计复杂度增加,不易测试,以及违反了单一职责原则,因此在实际...
#### 四、单例模式的优缺点 ##### 优点 - **减少内存开销**:避免了多次创建不必要的对象实例,节省了内存空间。 - **方便全局访问**:通过单例模式可以方便地获取对象实例,无需重复创建。 - **便于扩展**:由于...
### OC单例模式讲解 #### 一、单例模式简介 单例模式是设计模式中的一种,属于创建型...通过本文的介绍,我们了解了单例模式的概念、实现方法以及其优缺点。希望这些内容能够帮助开发者更好地理解和应用单例模式。
两种实现方式都可以实现单例模式,但是它们有不同的优缺点。 单例模式是一种常用的设计模式,用于确保系统中只有一个实例存在,并提供了一个全局访问点来访问该实例。它可以应用于各种系统,如服务器负载均衡器、...
下面我们将深入探讨单例模式的实现方式、优缺点以及在实际开发中的应用。 首先,单例模式的三个核心特性如描述中所提到: 1. **唯一实例**:在程序运行期间,单例类只能被实例化一次。这通常通过将构造函数设为私有...