经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
单例模式 - spring-effort
来源:cnblogs  作者:spring-effort  时间:2019/9/20 9:49:26  对本文有异议

1.单例模式:

  这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象创建。这个类提供一种访问方式访问其唯一的对象的方式,

  可以直接访问,不需要实例化该类对象。

 

2.特点:

  1.单例类只能有一个实例。

  2.单例类必须自己创建自己的唯一实例。

  3.单例类必须给所有其他对象提供这一实例。

 

3.实现方法:

  许多人可能值记得懒汉式和饿汉式,但是最好尽可能全记住,不然面试官问你还有没有其他的那就哑然了。

  (1)懒汉式:线程不安全,加锁会影响效率

  1. 1 public class LSingle {
  2. 2 private static LSingle single;
  3. 3 //私有的无参构造器一定要存在:不想用别人用new的方法创建对象
  4. 4 private LSingle() {}
  5. 5 //加锁解决线程不安全问题但是影响效率
  6. 6 public static /*synchronized*/ LSingle getSingle() {
  7. 7 if(single==null)single = new LSingle();
  8. 8 return single;
  9. 9 }
  10. 10
  11. 11 }

  (2)饿汉式:线程安全,在类加载中初始化,浪费内存

  1. 1 public class ESingle {
  2. 2 private static ESingle single = new ESingle();
  3. 3 //必须存在私有构造器
  4. 4 private ESingle() {}
  5. 5 public static ESingle getSingle() {
  6. 6 return single;
  7. 7 }
  8. 8
  9. 9 }

  (3)双重校验锁:采用双锁机制,安全且在多线程的情况下保持高性能,但是不易实现

  1. 1 public class DoubleLockSingle {
  2. 2 private static DoubleLockSingle single;
  3. 3 //必须存在私有构造器
  4. 4 private DoubleLockSingle() {}
  5. 5 public static DoubleLockSingle getSingle() {
  6. 6 if(single==null) {
  7. 7 synchronized(DoubleLockSingle.class) {
  8. 8 if(single==null) {
  9. 9 single = new DoubleLockSingle();
  10. 10 }
  11. 11 }
  12. 12 }
  13. 13 return single;
  14. 14 }
  15. 15
  16. 16 }

  (4)静态内部类/登记式:线程安全,和双锁机制效果一样,实现更简单,只是有于静态域

  1. public class StaticSingle {
  2. private static class InnerSingle{
  3. //常量:直接调用
  4. private static final StaticSingle single = new StaticSingle();
  5. }
  6. public static StaticSingle getSingle() {
  7. return InnerSingle.single;
  8. }
  9. }

  (5)枚举:线程安全,实现容易,是实现单例模式的最佳方法,支持自动系列化机制防止多次序列化,但是使用的少

  1. 1 //枚举类
  2. 2 public enum EnumSingle {
  3. 3 single;
  4. 4 public void whateverMethod() {
  5. 5 }
  6. 6 }

 

原文链接:http://www.cnblogs.com/spring-effort/p/11553443.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号