- 浏览: 1093194 次
文章分类
- 全部博客 (379)
- S2SH (16)
- stuts2 (0)
- java语言 (81)
- JSP (17)
- <html>元素 (11)
- javaweb (4)
- web容器 (3)
- ext (23)
- javaScript (48)
- ant (1)
- liferay (1)
- sql (9)
- css (42)
- 浏览器设置 (3)
- office_world (1)
- eclipse (4)
- 其它 (28)
- 操作系统 (5)
- android (6)
- Struts2 (11)
- RegEx (3)
- mysql (5)
- BigDATA (1)
- Node.js (1)
- Algorithm (10)
- Apache Spark (1)
- 数据库 (5)
- linux (2)
- git (1)
- Adobe (3)
- java语言,WebSocket (1)
- Maven (3)
- SHELL (1)
- XML (2)
- 数学 (2)
- Python (2)
- Java_mysql (1)
- ReactJS (6)
- 养生 (4)
- Docker (1)
- Protocols (3)
- java8 (2)
- 书籍 (1)
- Gradle (2)
- AngularJS (5)
- SpringMVC (2)
- SOAP (1)
- BootstrapCSS (1)
- HTTP协议 (1)
- OAuth2 (1)
最新评论
-
Lixh1986:
Java并发编程:自己动手写一把可重入锁https://blo ...
Java之多线程之Lock与Condition -
Lixh1986:
http://win.51apps.com.cn/https: ...
temp -
ztwsl:
不错,支持很好
HttpServletRequest和ServletRequest的区别 -
guodongkai:
谢谢您能将知识精华汇编总结,让初学者们从原理中学会和提高。
javaScript之function定义 -
kangwen23:
谢谢了,顶顶
struts2中的ValueStack学习
Java之设计模式之Singleton
Java Singleton 单例设计模式属于四大设计模式之生产设计模式的一种。
该设计模式看似简单,但是涉及到许多注意点。
一、Java Singleton 简介
Java Singleton 单例设计只允许在JVM中产生类的一个实例对象。
因此这样的类不能提供对外的构造方法产生实例,而是提供一个 public 方法,
返回(指向)某个实例的引用。
Java Singleton 单例设计常用于:
1、Logging(日志)
2、Driver(驱动)
3、Caching(缓存)
4、Thread Pool(线程池)
5、Abstract Factory(抽象工厂)
6、Builder(构建器)
7、Prototype(原型设计)
8、Facade Design Pattern
在 core java 中也有出现单例模式的设计:
java.lang.Runtime
java.awt.Desktop
等
二、实现 Java Singleton
实现单例需要符合下列三点:
1、private 的构造方法。阻止除本类外的其他类对该类进行实例的构建。
2、private , static 的属性。这就是那个单例。
3、public static 的方法,用于对外返回单例。
单例的实现有以下几种方式:
按初始化分:
1、Eager initializtion (急初始化)
2、Static block initializtion (静态块初始化)
3、Lazy initializtion (懒初始化)
按线程安全分:
4、Thread Safe Singleton(线程安全式单例)
5、Bill Push Singleton(Bill Push 单例)
下面将逐一讲解:
1、Eager initializtion (急初始化)
急初始化模式下,单例在 Class 被 JVM 加载时即被创建。
优点:
-容易实现。
缺点:
-该类未被使用到时也被初始化。
-不能进行异常处理。
点评:
如果使用较少的资源,可以使用此方法。
多数情形下,如 File System,Database Connection,应避免使用此方法。
代码:
2、Static block initializtion (静态块初始化)
静态块初始化方法跟急初始化差不多,只是可以在静态块中处理异常。
3、Lazy initializtion (懒初始化)
懒初始化单例设计模式,是在对外的 public 方法中生成实例对象的。
只需加一个是否为空的判断即可。
上面3种单例设计方式,在单线程的环境下可以正常工作。
但是,在多线程的环境下不行:当多个线程同时运行在 if 块内,
可能会产生多个实例对象。
下面讲述多线程环境下的单例模式。
4、Thread Safe Singleton(线程安全式单例)
最简单的实现是给对外公开的 public 的方法增加 synchronized 修饰符。
说明:关于 synchronized修饰符
这样一次只能有一个线程可以访问该方法。
上面的方法在功能实现角度上是没有任何问题的。但是有一缺陷:效率比较低。
其实,只需对实例第一次产生时进行 synchroinized 即可。
改进:
5、Bill Push Singleton(Bill Push 单例)
在 Java 1.5 之前,java 内存模型有很多问题。
尤其是线程很多的情况下,上面的实现方式会莫名其妙的失效。
于是乎,Bill Push 提出了单例模式的另一种实现方式:借助内部类。
内部类何时被初始化?
当类被 JVM 装载时,内部类不会被装载,直到 getInstance() 方法被调用。
这是被最广泛使用的线程安全的单例模式。
因为它不需要任何的 synchronized 修饰符。
三、Java Singleton 之继续讨论
1、Using Reflection to destroy Signleton Pattern
使用反射来破坏单例设计模式:
当使用反射机制生成类的实例时,上述单例设计方法便失效了。
上述两个 hashCode() 值是不同的。
2、Enum Singleton(枚举式单例)
为了克服使用反射所带来的问题, Joshua Bloch 建议使用 Enum 实现单例。
因为 Java 可以保证 enum value 只会被初始化一次。
既于 enum 的值都是 public 的,这种方式可以作为单例的实现之一。
缺点:
不够灵活。
急初始化,不能懒初始化。
3、Serializtion and Singleton(单例序列化)
在分布式系统中,有时候需要对单例进行序列化(实现 Serializable 接口),
以便在系统磁盘中(或网络传输中)保存单例的状态,然后在后续的某个点取得具状态的单例。
在反序列化单例时,可能会使得到的实例与原来的不同(如果单例仅仅实现 Serializable 接口)。
解决方案是重写 Serializtion API 中的 readResolve() 方法。
测试类:
-
转载请注明,
原文出处:http://lixh1986.iteye.com/blog/2351353
引用:
http://www.journaldev.com/1377/java-singleton-design-pattern-best-practices-examples
-
Java Singleton 单例设计模式属于四大设计模式之生产设计模式的一种。
该设计模式看似简单,但是涉及到许多注意点。
一、Java Singleton 简介
Java Singleton 单例设计只允许在JVM中产生类的一个实例对象。
因此这样的类不能提供对外的构造方法产生实例,而是提供一个 public 方法,
返回(指向)某个实例的引用。
Java Singleton 单例设计常用于:
1、Logging(日志)
2、Driver(驱动)
3、Caching(缓存)
4、Thread Pool(线程池)
5、Abstract Factory(抽象工厂)
6、Builder(构建器)
7、Prototype(原型设计)
8、Facade Design Pattern
在 core java 中也有出现单例模式的设计:
java.lang.Runtime
java.awt.Desktop
等
二、实现 Java Singleton
实现单例需要符合下列三点:
1、private 的构造方法。阻止除本类外的其他类对该类进行实例的构建。
2、private , static 的属性。这就是那个单例。
3、public static 的方法,用于对外返回单例。
单例的实现有以下几种方式:
按初始化分:
1、Eager initializtion (急初始化)
2、Static block initializtion (静态块初始化)
3、Lazy initializtion (懒初始化)
按线程安全分:
4、Thread Safe Singleton(线程安全式单例)
5、Bill Push Singleton(Bill Push 单例)
下面将逐一讲解:
1、Eager initializtion (急初始化)
急初始化模式下,单例在 Class 被 JVM 加载时即被创建。
优点:
-容易实现。
缺点:
-该类未被使用到时也被初始化。
-不能进行异常处理。
点评:
如果使用较少的资源,可以使用此方法。
多数情形下,如 File System,Database Connection,应避免使用此方法。
代码:
public class EagerInitializedSingleton { private static final EagerInitializedSingleton instance = new EagerInitializedSingleton(); //私有构造方法,避免其它类在该类外部构造此类的实例。 private EagerInitializedSingleton(){} public static EagerInitializedSingleton getInstance(){ return instance; } }
2、Static block initializtion (静态块初始化)
静态块初始化方法跟急初始化差不多,只是可以在静态块中处理异常。
public class StaticBlockSingleton { private static StaticBlockSingleton instance; private StaticBlockSingleton(){} //static block initialization for exception handling static{ try{ instance = new StaticBlockSingleton(); }catch(Exception e){ throw new RuntimeException("Exception occured in creating singleton instance"); } } public static StaticBlockSingleton getInstance(){ return instance; } }
3、Lazy initializtion (懒初始化)
懒初始化单例设计模式,是在对外的 public 方法中生成实例对象的。
只需加一个是否为空的判断即可。
public class LazyInitializedSingleton { private static LazyInitializedSingleton instance; private LazyInitializedSingleton(){} public static LazyInitializedSingleton getInstance(){ if(instance == null){ instance = new LazyInitializedSingleton(); } return instance; } }
上面3种单例设计方式,在单线程的环境下可以正常工作。
但是,在多线程的环境下不行:当多个线程同时运行在 if 块内,
可能会产生多个实例对象。
下面讲述多线程环境下的单例模式。
4、Thread Safe Singleton(线程安全式单例)
最简单的实现是给对外公开的 public 的方法增加 synchronized 修饰符。
说明:关于 synchronized修饰符
这样一次只能有一个线程可以访问该方法。
public class ThreadSafeSingleton { private static ThreadSafeSingleton instance; private ThreadSafeSingleton(){} public static synchronized ThreadSafeSingleton getInstance(){ if(instance == null){ instance = new ThreadSafeSingleton(); } return instance; } }
上面的方法在功能实现角度上是没有任何问题的。但是有一缺陷:效率比较低。
其实,只需对实例第一次产生时进行 synchroinized 即可。
改进:
public class ThreadSafeDoubleCheckingSingleton { private static ThreadSafeDoubleCheckingSingleton instance; private ThreadSafeDoubleCheckingSingleton(){} public static ThreadSafeDoubleCheckingSingleton getInstance(){ if(instance == null){ synchronized(ThreadSafeDoubleCheckingSingleton.class){ if(instance == null){ instance = new ThreadSafeDoubleCheckingSingleton(); } } } return instance; } }
5、Bill Push Singleton(Bill Push 单例)
在 Java 1.5 之前,java 内存模型有很多问题。
尤其是线程很多的情况下,上面的实现方式会莫名其妙的失效。
于是乎,Bill Push 提出了单例模式的另一种实现方式:借助内部类。
public class BillPughSingleton { private BillPughSingleton(){} private static class SingletonHelper{ private static final BillPughSingleton INSTANCE = new BillPughSingleton(); } public static BillPughSingleton getInstance(){ return SingletonHelper.INSTANCE; } }
内部类何时被初始化?
当类被 JVM 装载时,内部类不会被装载,直到 getInstance() 方法被调用。
这是被最广泛使用的线程安全的单例模式。
因为它不需要任何的 synchronized 修饰符。
三、Java Singleton 之继续讨论
1、Using Reflection to destroy Signleton Pattern
使用反射来破坏单例设计模式:
当使用反射机制生成类的实例时,上述单例设计方法便失效了。
public class ReflectionSingletonTest { public static void main(String[] args) throws Exception{ EagerInitializedSingleton instanceOne = EagerInitializedSingleton.getInstance(); EagerInitializedSingleton instanceTwo = null; Constructor constructor = EagerInitializedSingleton.class.getDeclaredConstructor(); constructor.setAccessible(true); instanceTwo = (EagerInitializedSingleton) constructor.newInstance(); System.out.println(instanceOne.hashCode()); System.out.println(instanceTwo.hashCode()); } }
上述两个 hashCode() 值是不同的。
2、Enum Singleton(枚举式单例)
为了克服使用反射所带来的问题, Joshua Bloch 建议使用 Enum 实现单例。
因为 Java 可以保证 enum value 只会被初始化一次。
既于 enum 的值都是 public 的,这种方式可以作为单例的实现之一。
缺点:
不够灵活。
急初始化,不能懒初始化。
public enum EnumSingleton { INSTANCE; public static void doSomething(){ System.out.println("do something..."); } }
3、Serializtion and Singleton(单例序列化)
在分布式系统中,有时候需要对单例进行序列化(实现 Serializable 接口),
以便在系统磁盘中(或网络传输中)保存单例的状态,然后在后续的某个点取得具状态的单例。
在反序列化单例时,可能会使得到的实例与原来的不同(如果单例仅仅实现 Serializable 接口)。
解决方案是重写 Serializtion API 中的 readResolve() 方法。
import java.io.Serializable; public class SerializedSingleton implements Serializable{ private static final long serialVersionUID = -7604766932017737115L; private SerializedSingleton(){} private static class SingletonHelper{ private static final SerializedSingleton instance = new SerializedSingleton(); } public static SerializedSingleton getInstance(){ return SingletonHelper.instance; } // This will fix the de-serialization issue private Object readResolve() { // Return the available instance instead. return getInstance(); } } /* readResolve() is used for replacing the object read from the stream. The only use I've ever seen for this is enforcing singletons; when an object is read, replace it with the singleton instance. This ensures that nobody can create another instance by serializing and de-serializing the singleton. */
测试类:
import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectInputStream; import java.io.ObjectOutput; import java.io.ObjectOutputStream; public class SerializedSingletonTest { public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException { SerializedSingleton instanceOne = SerializedSingleton.getInstance(); ObjectOutput out = new ObjectOutputStream(new FileOutputStream("filename.ser")); out.writeObject(instanceOne); out.close(); //deserailize from file to object ObjectInput in = new ObjectInputStream(new FileInputStream("filename.ser")); SerializedSingleton instanceTwo = (SerializedSingleton) in.readObject(); in.close(); System.out.println("instanceOne hashCode = "+instanceOne.hashCode()); System.out.println("instanceTwo hashCode = "+instanceTwo.hashCode()); } }
-
转载请注明,
原文出处:http://lixh1986.iteye.com/blog/2351353
引用:
http://www.journaldev.com/1377/java-singleton-design-pattern-best-practices-examples
-
发表评论
-
java 将文件夹所有的文件合并到指定的文件夹下
2020-06-30 19:17 987场景:将文件夹所有的文件合并到指定的文件夹下 另外:如果想效 ... -
多线程-线程池的四种创建方式
2020-04-01 18:38 419多线程-线程池的四种创建方式 https://blog.cs ... -
Java基础之:nio
2019-11-13 15:38 417一、理论讲解: 史上最强Java NIO入门:担心从入门到放弃 ... -
Java 分布式之:RPC 基本概念
2019-11-13 15:07 405转载: https://www.jianshu.com/p/ ... -
Java之 volatile 关键字原理详解
2019-11-07 15:36 450一、什么是 volatile ? ... -
POI实现excell批注背景图片(仿html浮窗显示图片)
2019-10-21 08:17 609POI实现excell批注背景图片(仿html浮窗显示图片) ... -
Java之设计模式之 Observer 观察者
2019-07-04 17:21 978观察者设计模式 Java 已经实现了该模式,并且提供了使用类 ... -
HashMap, LinkedHashMap and TreeMap
2019-03-01 11:04 629https://stackoverflow.com/a/177 ... -
Java lib 操作 excel 插入图片
2019-01-19 12:46 843https://poi.apache.org/componen ... -
数据库连接池C3P0
2018-05-29 16:50 821一、名字的由来 很多 ... -
Java8之集合(Collection)遍历 forEach()、stream()
2018-05-29 14:39 20666package java8.collections; ... -
Junit Vs main on "java.util.concurrent.Executors"
2017-11-10 16:44 737Same code with different result ... -
Java之大数据学习路线
2017-11-03 10:08 5677三个月大数据研发学习 ... -
Java中创建对象的5种方式
2017-10-26 14:21 813一、Java之5种创建对象的方式 ————————————— ... -
Log4j和Slf4j的比较
2017-06-23 12:41 1369一直搞不清 Log4j 和 SLF4j 的关系。今天才若有所 ... -
Java之Java7新特性之try资源句式
2017-04-20 14:58 5346Java之Java7新特性之try资源句式 一、【try资源 ... -
Java之 java.util.concurrent 包之ExecutorService之submit () 之 Future
2017-03-04 21:27 3778一、如何使用 ExecutorService.submit() ... -
Java之 java.util.concurrent 包之Executor与ExecutorService
2017-03-04 21:18 2652一、问题: execute() 与 submit() 的区别? ... -
JAVAEE之单用户登录
2017-02-05 11:55 1036单用户登录是系统中数据一直性的解决方案之一。 问题背景: 试 ... -
Java之多线程之线程池之线程重复使用
2017-02-04 13:33 5531一、问题背景 在使用多线程时,如果要开启一个任务,则就需要新 ...
相关推荐
Java常用设计模式(SingleTon、FactoryMethod、AbstractFactory)
java singleton 不解释不解释不解释不解释
设计模式之Singleton(单态) 结构模式: 设计模式之Facade(外观) 设计模式之Proxy(代理) 设计模式之Adapter(适配器) 设计模式之Composite(组合) 设计模式之Decorator(油漆工) 设计模式之Bridge 设计模式之Flyweight(享...
简单的单例模式举例Singleton 分为恶汉式 懒汉式
描述设计模式之Singleton 模式的应、及举例说明了在JAVA中单利模式的具体应用。
java设计模式,单例模式的不同实现方式
主要介绍了Java设计模式之单态模式(Singleton模式)介绍,本文讲解了如何使用单例模式、使用单例模式注意事项等内容,需要的朋友可以参考下
这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。 工厂模式(Factory Pattern) 抽象工厂模式...
《java设计模式(第2版)》通过一个完整的java项目对经典著作design patterns一书介绍的23种设计模式进行了深入分析与讲解,实践性强,却又不失对模式本质的探讨。本书创造性地将这些模式分为5大类别,以充分展现各个...
里面包含了23中设计模式源代码,其中包括工厂模式(Factory)、单例(Singleton)、观察者模式(Observer)、适配器模式(Adapter)、Template模式、Decorate模式、proxy模式等 这些代码对于初学者看起来稍微复杂一些,我...
用Java实现23种设计模式 1. 创建型模式 工厂模式(Factory Pattern) 抽象工厂模式(Abstract Factory Pattern) 单例模式(Singleton Pattern) 建造者模式(Builder Pattern) 原型模式(Prototype Pattern)...
本资源为 "大话西游之设计模式_从猴王出世看singleton"文章的配套代码,通过该代码,可以更加清晰的了解猴王出世故事的流程及代码模拟,也能清楚的知道singleton的全部内容。 该代码在java环境开发,可以正常运行,...
适合Java设计模式期末考试选择题复习,形式如下: 10.(单选题)Facade(外观)模式的意图是 正确答案: A A.希望简化现有系统的使用方法,你需要定义自己的接口 B.将一个无法控制的现有对象与一个特定借口相匹配。 C....
为了更好的网络共享 本人发布的资源一律免费 如有哪个收费了 请告知! 压缩包 包括常用的几种模式: 设计模式的原则 设计模式袖珍版之-Decorator(油漆工) ...设计模式袖珍版之-Singleton(单态) 设计模式袖珍版之-Visitor
23种Java设计模式.txt J2EE相关设计模式讨论.txt Java设计模式.doc Singleton 模式在 Java 中的应用.txt
Java面向对象(高级)-- 单例(Singleton)设计模式
Factory模式,Prototype模式,Builder 模式,Singleton模式,Facade模式,Proxy模式,Adapter模式,Composite模式,Decorator模式....
设计模式 t04Singleton
首先介绍了Java中面向对象特性和技术,逐个分析Abstract Factory;Builder;Prototype;Singleton;Adapter (对象);Bridge;Composite;Decorator;Facade;Flyweight;Proxy;Iterator;Observer等模式
23种java版设计模式源码案例.zip 0.目录 创建型模式(creational) 简单工厂(simplefactory) 动态工厂(dynamic) 抽象工厂(abstract) 单例模式(singleton) 建造者模式(builder) 原型模式(prototype) 结构型模式...