- 浏览: 684325 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (362)
- java基础 (33)
- html/css+div/javascript (17)
- Ajax/XML/JSON/XSL (7)
- JQuery (11)
- Extjs (1)
- JSP/Servlet (19)
- MVC模式 (4)
- struts 1 (17)
- Struts 2.3.4 (17)
- Spring 3.2 (26)
- Springmvc (3)
- Hibernate 4.1 (21)
- ibatis (6)
- Velocity模板语言 (2)
- Rose框架 (5)
- EJB (1)
- JUnit测试 (2)
- 数据库DB (24)
- 重构 / 设计模式 (3)
- 开发工具IDE (37)
- 数据结构与算法设计 (3)
- Android (12)
- Linux (4)
- bug集合 (29)
- 缓存技术(redis) (3)
- Lucene全文索引 (15)
- maven3.0.5 (4)
- 小工具集合 (18)
- 面试题 (5)
- 闲聊 (11)
- 其他 (4)
- 接口API (2)
- work (2)
- Flex (0)
- JMS (1)
- 开源项目集合 (1)
- 技术博客 (1)
- 分类04 (0)
- 分类05555 (0)
最新评论
-
小小小羊:
好屌...
java.lang.NoClassDefFoundError: org/aspectj/weaver/reflect/ReflectionWorld$Refle -
liubinli2005:
这个可以脱底spring。单独使用吗?
DAO层:jade -
cangbaotu:
我觉得对于开发者来说,能脚本化编写爬虫是一件挺开心的事情( ̄▽ ...
网页爬取 -
asjava:
很好的文章, 但每段代码清单都重复了一次.
spring 事务 -
xia635317478:
jethypc 写道验证码的session无法传过去啊 还是我 ...
登陆验证码(struts2实现)
单例模式总结
转自:http://hi.baidu.com/donlian/item/b746f074655ee93e704423f0
单实例的正确写法 并文章属于Java并发编程实战中例子。但结合实际场景进行了阐述。 通常,我们如果写一个单实例模式的对象,一般会这样写: 写法一: Java代码 public class Singleton { private static final Singleton instance = new Singleton(); /** * 防止其他人new对象 */ private Singleton(){ System.out.println("init"); } public static Singleton getInstance(){ return instance; } } 这种方式叫饥饿式单实例,意思是说,不管你用不用这个类的方法,我都把这个类需要的一切资源都分配好。但这样写有一个问题,就是如果这类需要的资源比较多,在系统启动的时候,就会很慢。 因此要求有懒汉式单实例,于是就出现了第二中写法, 写法二: Java代码 public class Singleton { private static Singleton instance = null; /** * 防止其他人new对象 */ private Singleton(){ System.out.println("init"); } public static Singleton getInstance(){ if(instance == null){ instance = new Singleton(); } return instance; } } 这种方式叫懒汉式单实例,即通常所说的延迟加载。这样,在系统启动的时候,不会加载类所需要的各种资源,只有真正使用的时候才去加载各种资源。 但这种方法马上就可以看出问题,因为在多线程情况下,可能会导致重复初始化的问题(不明白这个道理,那您需要补充一下同步及多线程知识了)。于是有了改进版,即目前网上比较流行的写法。 写法三: Java代码 public class Singleton { private static Singleton instance = null; /** * 防止其他人new对象 */ private Singleton(){ System.out.println("init"); } public static synchronized Singleton getInstance(){ if(instance == null){ instance = new Singleton(); } return instance; } } 加上关键字synchronized,可以保证只有一个线程在执行这个方法。这个方法至此应该说是比较完美的了,但是,专家不这么认为,在高并发多线程的访问系统中,synchronized关键字会让程序的吞吐量急剧下降,因此,在高并发系统中,应该尽量避免使用synchronized锁。 但这并不能难住我们聪明的软件工程师,有人便写出了双重锁的程序。方法如下: 写法四: Java代码 public class Singleton { private static Singleton instance = null; /** * 防止其他人new对象 */ private Singleton(){ System.out.println("init"); } public static Singleton getInstance(){ if(instance == null){ synchronized(Singleton.class){ if(instance == null){ instance = new Singleton(); } } } return instance; } } 这样,通常获得单实例引用是没有锁的,只有第一次初始化时才会加锁,而且如果多个线程进入临界区区后,理论上只有第一个进入临界区的线程才会初始化对象,之后进入临界区的线程因为之前的线程已经初始化,就不会再次进行初始化。 但专家怎么说呢?这个代码有问题。首先,这个程序对同步的应用很到位,即当进入synchronied区,只有一个线程在访问Singleton类。但却忽略了变量的可见性。因为在没有同步的保护下,instance的值在多个线程中可能都是空的,因为即便第一个线程对类进行了初始化,并把类的引用赋值给了instance变量,但也不能保证instance变量的值对其他线程是可见的,因为变量instance没有采用同步的机制。 在java5之后,可以在instance前面添加volatile关键字来解决这个问题,但是这种双重锁的方式已经不建议使用。 那么,看看大师推荐的写法吧,见 Java Concurrency In Practice的List 16.6代码: 写法五: Java代码 public class Singleton { private static class SingletonHolder { public static Singleton resource = new Singleton(); } public static Singleton getResource() { return SingletonHolder.resource ; } private Singleton(){ } } 综上各种写法,发现写法一虽然在启动时会让系统启动的慢一些,但却不失为一种简洁而高效的写法,当然,如果确实对系统启动时的速度要求高的话,则应该考虑写法五了。 另外,其实单实例方法还有好多种,在effective Java中有写到: 写法六: Java代码 public class Singleton { public static final Singleton INSTANCE = new Singleton(); private Singleton(){} public void method(){ //... } public static void main(String[] a){ //调用方法。 Singleton.INSTANCE.method(); } } 写法七: Java代码 /** * 利用枚举巧妙创建单实例 */ public enum Singleton { INSTANCE; public void method(){ //... } public static void main(String[] a){ //调用方法。 Singleton.INSTANCE.method(); } } 另外,双重锁的方式,在加上volatile关键字后,也是高效安全的写法。 写法八: Java代码 public class Singleton { private static volatile Singleton instance = null; /** * 防止其他人new对象 */ private Singleton(){ System.out.println("init"); } public static Singleton getInstance(){ if(instance == null){ synchronized(Singleton.class){ if(instance == null){ instance = new Singleton(); } } } return instance; } } 其实,在今天spring大行其道的天下,单实例需求已经不多,spring中的bean默认都是单实例。但是要做一些app程序或者开发一个产品时,这种模式还是很重要的。综上所述,我个人比较推荐写法五和写法一,写法七怎么看着也别扭。
转自:http://hi.baidu.com/donlian/item/b746f074655ee93e704423f0
发表评论
-
放假咯
2020-01-21 16:52 0放假咯放假咯放假咯放假咯放假咯 -
break和continue再循环for或while中用法
2014-10-26 12:25 1109package com.chaoxing.fayuan2. ... -
System.getProperty()参数大全
2013-07-22 10:26 840System.getProperty()参数大全 j ... -
java流操作总结
2013-07-21 12:11 806java流操作总结 1.控制台读取,控制台输出 / ... -
指定排序规则
2013-07-04 10:32 908指定排序规则 // 指定排序规则 Compar ... -
时间工具类
2013-07-03 16:58 1104时间工具类 package com.momo.util; ... -
获得指定日期
2013-07-03 16:32 967获得指定日期 格式化 ... -
Integer == Integer?
2013-04-08 22:03 1037Integer == Integer? /** * ... -
GBK、GB2312、UTF-8
2013-03-16 18:42 1114UTF-8:Unicode Transformation F ... -
理解ThreadLocal
2013-03-15 13:12 773http://blog.csdn.net/qjyong/art ... -
CSS文本溢出省略号:text-overflow:ellipsis及firefox兼容详解
2013-03-04 10:53 1118http://blog.163.com/yinwei_666/ ... -
http://blog.csdn.net/droid_zhlu/article/details/6441213
2013-02-26 09:48 964http://blog.csdn.net/droid_zhlu ... -
JavaMail邮件发送Demo
2012-12-26 11:37 3056JavaMail邮件发送Demo import com ... -
正则表达式
2012-12-19 11:08 913一、简介 二、匹配操作符 三、模式中的特殊字符 ... -
内存溢出和内存泄露
2012-12-18 10:34 1816内存溢出 和 内存泄露 ... -
java术语(PO/POJO/VO/BO/DAO/DTO)
2012-11-30 13:47 1715java术语(PO/POJO/VO/BO/DAO/DT ... -
java趣味小程序
2012-11-22 10:36 2062java趣味小程序 【程 ... -
Java容器集合学习心得
2012-11-01 09:41 820Java容器集合 ... -
eclipse 编译javac、运行java
2012-10-28 14:45 1961语法错误javac(编译),逻辑错误java(运行) ec ... -
类对象的 显示转换 和 隐式转换
2012-10-28 12:41 1139类对象的 显示转换 和 隐式转换 public cla ...
相关推荐
单例模式的七种实现方法以及分析,可以作文大作业提交 1.前言 4 1.1 课题的研究背景 4 1.2 课题主要研究目标 4 2.相关技术简介 4 2.1Java简介 4 2.2IDEA简介 4 3. 单例模式的7种实现方式 5 3.1饿汉式(使用静态常量...
Java单例模式,其中:单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种
通过学习java 简单总结单例模式与装饰者模式,做一下入门总结,主要讲述单例模式中饿汉式与懒汉式的相同点与不同点,方便理解记忆。
设计模式总结-模板设计模式,单例模式(singleTon)
深入分析java单例模式什么是单例模式单例模式的常见写法一、饿汉式单例优点缺点示例二、懒汉式单例示例1(普通写法)示例2(synchronized写法)示例3(DCL写法)示例4(内部类写法)三、注册式单例示例1(容器式)示例2(枚举式...
单例模式 设计模式 总结多种情况,覆盖面挺全的
今天在复习设计模式中的-创建型模式,发现JS实现单例模式的方案有很多种,稍加总结了一下,列出了如下的6种方式与大家分享 大体上将内容分为了ES5(Function)与ES6(Class)实现两种部分 单例模式就是在系统中...
主要介绍了C#设计模式之单例模式实例讲解,本文讲解了单例模式的定义、单例模式的优缺点,需要的朋友可以参考下
自己总结的6中单例模式的写法,也有测试类,可以试验下,自己稍微修改一下后,验证安全性,纯粹为学习,建议可提
java 设计模式–单例模式推理过程 设计模式(全名:软件设计模式),是一套反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。 使用设计模式是为了可重用代码,让代码更容易被他人理解,保证代码可靠性...
单例模式的总体概述 单例模式,属于创建型模式,《设计模式》一书对它做了定义:保证一个类仅有一个实例,并提供一个全局访问点。 单例模式适用于无状态的工具类、全局信息类等场景。例如日志工具类,在系统中记录...
首先,了解一下什么是单例模式,这里我直接把软件开发网中的定义给copy过来: 单例模式(Singleton Pattern)是 Java 中最简单的...用一句话来总结就是:在单例模式中,一个类仅有一个实例,并提供一个访问它的全局访
主要介绍了NodeJS设计模式,结合实例形式总结分析了nodejs单例模式,适配器模式,装饰模式,观察者模式的概念、原理与具体实现技巧,需要的朋友可以参考下
最近在做游戏开发,阅读了一些源码后做了一些总结与记录,希望对自己和其他的朋友有所帮助
单例模式是JavaScript项目中最常用的设计模式之一,下面罗列了JavaScript实现设计模式中的单例模式的一些技巧总结,包括惰性加载与分支技术等,需要的朋友可以参考下.
① 应用场景实例② 模式优点③ 模式缺点④ 注意事项■ 单例模式的五种实现方式饿汉式代码实现懒加载代码实现双重检测锁代码实现静态内部类代码实现(也是懒加载的一种方式)枚举代码实现:diamond_suit: 总结 ...
Android单例模式的几种方法总结 因为单例模式过于简单,下面我就直接上代码了。 简单式: public class Single{ private static Single single=new Single(); public static Single instance(){ return singlel;...
我们总结分析单例模式的时候,了解到单例模式的要点有三个:一是某个类只能有一个实例;二是它必须自行创建这个事例;三是它必须自行向整个系统提供这个实例。在下面的对象图中,有一个"单例对象",而"客户甲"、...
前言 最近开始花点心思研究下设计模式,主要还是让自己写的代码可重用性高、保证代码可靠性。所谓设计模式,我找了下定义...单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过