1:懒汉式,不保证线程安全

package com.yan.singleton;

public class LazySingleton {

    private static final LazySingleton instance = null;

    private LazySingleton(){}

    public static LazySingleton getLazySingleton(){
if(null==instance){
return new LazySingleton();
} return instance;
}
}

2:饿汉式,线程安全

package com.yan.singleton;

public class HungrySingleton {
private HungrySingleton(){} private static final HungrySingleton instance = new HungrySingleton(); public static HungrySingleton getInstance(){
return instance;
}
}

3:静态内部类,线程安全

package com.yan.singleton;

public class InnerClassSingleton {

    private InnerClassSingleton(){}

    public static final InnerClassSingleton getInstance(){
return InnerClassSingletonHolder.INSTANCE;
} private static class InnerClassSingletonHolder{
private static final InnerClassSingleton INSTANCE = new InnerClassSingleton();
}
}

4:枚举,线程安全,可以反序列化(推荐此种方式)JDK1.5之后才可以使用

package com.yan.singleton;

public enum EnumSingleton {

    INSTANCE;

    public void todo(){
System.out.println("todo");
}
}

方式1,2,3都可以使用反射机制来破坏其单例特性,采用枚举类型可以避免反射的破坏。

例如:

package com.yan.test;

import com.yan.singleton.LazySingleton;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.logging.Level;
import java.util.logging.Logger; public class Test { public static void main(String[] args) { Constructor<LazySingleton>cs ; try {
cs = (Constructor<LazySingleton>)
Class.forName("com.yan.singleton.LazySingleton")
.getDeclaredConstructor(); cs.setAccessible(true);//得到私有访问权限,如果不设置,则无法实例化对象 LazySingleton ls = cs.newInstance(); System.out.println("===ls:"+ls);
System.out.println("===ls:"+cs.newInstance()); } catch (ClassNotFoundException ex) {
Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
}catch (SecurityException ex) {
Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
} catch (IllegalArgumentException ex) {
Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
} catch (InvocationTargetException ex) {
Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
} catch (NoSuchMethodException ex) {
Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
} } }

最新文章

  1. topcoder SRM 628 DIV2 BishopMove
  2. tunning-Instruments and Flame Graphs
  3. PHPCMS 标签与示例
  4. ASP.NET MVC Model绑定小结
  5. 移动端的头部标签和meta
  6. eclipse安装Gradle
  7. React入门2
  8. [BZOJ 1072] [SCOI2007] 排列perm 【状压DP】
  9. centos5.5上apache快速安装H264流媒体支持MP4-H264边下边播
  10. ORA-20000: ORU-10027: buffer overflow, limit of 10000 bytes
  11. SQL Server中的查询
  12. win10 UWP Hmac
  13. iphone6 plus导入联系人或者通讯录
  14. oracle10G/11G官方迅雷下载地址合集
  15. Java用JSoup组件提取asp.net webform开发网页的viewstate相关相关参数
  16. Trailing Zeroes (III) LightOJ - 1138(二分)
  17. 062——VUE中vue-router之命名视图的实例
  18. 回顾C#经典算法冒泡排序
  19. 如何用MathType编辑出积分符号
  20. mongodb多表查询(附带pymongo实例)

热门文章

  1. maven下载jta失败,自己本地安装jta库
  2. analytics.js
  3. SKKeyframeSequence类
  4. android改动tab 导航 指示器颜色
  5. C# string.Format谨慎使用
  6. Java基础知识强化之集合框架笔记02:集合的继承体系图解
  7. linux中切换用户方式su和su -的区别
  8. Linux内核启动分析
  9. HTTP调试 抓包 工具 Fiddle 简介 示例
  10. lucene实战(第二版)学习笔记