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);
} } }

Java 单例总结的更多相关文章

  1. java单例的几种实现方法

    java单例的几种实现方法: 方式1: public class Something { private Something() {} private static class LazyHolder ...

  2. java单例类/

    java单例类  一个类只能创建一个实例,那么这个类就是一个单例类 可以重写toString方法 输出想要输出的内容 可以重写equcal来比较想要比较的内容是否相等 对于final修饰的成员变量 一 ...

  3. java单例-积木系列

    一步步知识点归纳吧,把以前似懂非懂,了解表面,知道点不知道面的知识归一下档.   懒汉式单例: 私有化构造函数,阻止外界实例话对象,调用getInstance静态方法,判断是否已经实例化. 为什么是懒 ...

  4. Java单例类的简单实现

    对于java新手来说,单例类给我的印象挺深,之前一道web后台笔试题就是写单例类.*.*可惜当时不了解. 在大部分时候,我们将类的构造器定义成public访问权限,允许任何类自由创建该类的对象.但在某 ...

  5. 【Java学习笔记之三十】详解Java单例(Singleton)模式

    概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建 ...

  6. 转:java单例设计模式

    本文转自:http://www.cnblogs.com/yinxiaoqiexuxing/p/5605338.html 单例设计模式 Singleton是一种创建型模式,指某个类采用Singleton ...

  7. 熟悉的味道——从Java单例写到C++单例

    设计模式中,单例模式是常见的一种.单例模式需要满足以下两个条件: 保证一个类只能创建一个示例: 提供对该实例的全局访问点. 关于单例最经典的问题就是DCL(Double-Checked Lock),今 ...

  8. java单例五种实现模式梳理

    java单例五种实现模式 饿汉式(线程安全,调用效率高,但是不能延时加载) 一上来就把单例对象创建出来了,要用的时候直接返回即可,这种可以说是单例模式中最简单的一种实现方式.但是问题也比较明显.单例在 ...

  9. JAVA单例实现方式(常用)

    JAVA单例实现方式(常用) public class Singleton { // Q1:为什么要使用volatile关键字? private volatile static Singleton u ...

  10. Java单例设计模式的实现

    1. 单例设计模式的定义 单例设计模式确保类只有一个实例对象,类本身负责创建自己的对象并向整个系统提供这个实例.在访问这个对象的时候,访问者可以直接获取到这个唯一对象而不必由访问者进行实例化. 单例设 ...

随机推荐

  1. Java学习日记-5 关键字static和final 以及接口

    乱入:表达式中的自动类型转换 char,short,byte都升级为int类型进行运算,结果为int,但其原变量类型并不改变. 所以,byte b = 10;  b = b*b; 编译时会报错.但是写 ...

  2. jquery动态添加元素无法触发绑定事件的解决方案。

    jquery动态添加元素无法触发绑定的事件的解决方案. ╭(●`∀´●)╯二狗最近在工作中遇到一个问题,即当用jquery动态添加元素后,发现给动态添加的元素却无法触发事件(╯#-_-)╯╧═╧ ( ...

  3. 程序中使用7-zip(7z)压缩文件

    Email:longsu2010 at yeah dot net 工作中难免遇到需要压缩文件的情况,比如有一千万个小文件,每个文件约100k,如果使用7-zip压缩后可能十几k,可以节省很多磁盘空间. ...

  4. Android ProgressBar SeekBar

    1.ProgressBar 进度条 当水平进度条完成后,隐藏该进度条,并显示一张图片 常用属性: 1. android:max 设置进度条的最大值 2. android:progress 用于指定进度 ...

  5. java.lang.UnsatisfiedLinkError: Native method not found 三种可能解决方案

    so文件编译生成后,运行时,有时候会遇到java.lang.UnsatisfiedLinkError: Native method not found问题,有可能是以下三种因素: 一.Jni方法头部大 ...

  6. Ubuntu ssh的使用

    1. 题外话:install teamviewer on Ubuntu. wget http://download.teamviewer.com/download/teamviewer_linux.d ...

  7. [转]在 SQL Server 2008 中新建用户登录并指定该用户的数据库

    提要:我在 SQL Server 中新建用户登录时,出现了三种错误,错误代码分别是 18456.15128.4064 -----------------------------------  正 文 ...

  8. linux定时执行任务 转

    转自:http://www.cnblogs.com/thinksasa/archive/2013/06/06/3121030.html linux定时执行任务   (1)Linux下如何定时执行php ...

  9. mysql 数据库字符串替换

    UPDATE `table_name` SET `field_name` = replace (`field_name`,'from_str','to_str') WHERE `field_name` ...

  10. (六)Angularjs - 启动引导

    自动引导 AngularJs 通过 ng-app 指令进行自动引导 手工引导启动框架 如果一个HTML文件中 有多个ng-app,AngularJS只会自动引导启动它找到的第一个ng-app应用,这是 ...