单例的实现

单例设计模式的问题

1.      线程安全问题用synchronized修饰实例化部分代码

2.      性能问题–采用懒汉式实例化

3.      指令重排序问题–用volatile修饰实例

4.      反序列化攻击问题–构造函数判断存在实例时抛异常

5.      反射攻击问题–增加readResolve方法

6.      不符合开闭原则,需要改代码

五种单例实现方式

1.   饿汉式

package me.muphy.singleton;

import java.io.Serializable;

/**
* 2019/4/1
* 莫非
*/
public class HungrySingleton implements Serializable{ private static final HungrySingleton hungrySingleton = new HungrySingleton(); private HungrySingleton() { } public static HungrySingleton getInstance() {
return hungrySingleton;
} private ObjectreadResolve() {
return hungrySingleton;
} }

2.   懒汉式延时加载方式

package me.muphy.singleton;

/**
* 2019/4/1
* 莫非
*/
public class LazySingleton { private volatile static LazySingleton lazySingleton = null; private LazySingleton() {
if (lazySingleton != null) {
throw new RuntimeException("此类以单例存在!");
}
} public static LazySingleton getInstance() throws Exception {
if (lazySingleton == null) {
synchronized (LazySingleton.class) {
if (lazySingleton == null) {
lazySingleton = new LazySingleton();
}
}
}
return lazySingleton;
} private Object readResolve() {
return lazySingleton;
} }

3.   懒汉式  内部内实现单例

package me.muphy.singleton;

/**
* 2019/4/1
* 莫非
*/
public class LazyJvmSingleton { private LazyJvmSingleton(){ } public static LazyJvmSingleton getInstance(){
return LazySingleton.lazyJvmSingleton;
} private static class LazySingleton{
public static final LazyJvmSingleton lazyJvmSingleton = new LazyJvmSingleton();
} private Object readResolve(){
return LazySingleton.lazyJvmSingleton;
}
}

4.   注册式  枚举式单例

package me.muphy.singleton;

/**
* 2019/4/1
* 莫非
*/
public enum EnumSingleton {
INSTANCE; private Object data; public Object getData() {
return data;
} public void setData(Object data) {
this.data = data;
} public static EnumSingleton getInstance() {
return INSTANCE;
}
}

5.   注册式  容器式单例

package me.muphy.singleton;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; /**
* 2019/4/1
* 莫非
*/
public class ContainerSingleton {
private ContainerSingleton() {
} private static Map<String, Object> ioc = new ConcurrentHashMap<>(); public static Object getBean(String className) {
synchronized (ioc) {
if (!ioc.containsKey(className)) {
try {
Object obj = Class.forName(className).newInstance();
ioc.put(className, obj);
return obj;
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
}
} return ioc.get(className);
}
}

线程内部的单例

线程内部的单例采用注册式单例,是伪线程安全的,可用来实现多数据源切换

package me.muphy.singleton;

/**
* 2019/4/2
* 莫非
*/
public class ThreadLocalSingleton { private ThreadLocalSingleton() {
} private static final ThreadLocal<ThreadLocalSingleton> threadLocalInstance =
new ThreadLocal<ThreadLocalSingleton>() { @Override
protected ThreadLocalSingleton initialValue() {
return new ThreadLocalSingleton();
}
}; public static ThreadLocalSingleton getInstance() {
return threadLocalInstance.get();
}
}

Java单例模式的实现的更多相关文章

  1. 用java单例模式实现面板切换

    1.首先介绍一下什么是单例模式: java单例模式是一种常见的设计模式,那么我们先看看懒汉模式: public class Singleton_ { //设为私有方法,防止被外部类引用或实例 priv ...

  2. 【深入】java 单例模式(转)

    [深入]java 单例模式 关于单例模式的文章,其实网上早就已经泛滥了.但一个小小的单例,里面却是有着许多的变化.网上的文章大多也是提到了其中的一个或几个点,很少有比较全面且脉络清晰的文章,于是,我便 ...

  3. 深入Java单例模式(转)

    深入Java单例模式 源自 http://devbean.blog.51cto.com/448512/203501 在GoF的23种设计模式中,单例模式是比较简单的一种.然而,有时候越是简单的东西越容 ...

  4. Java 单例模式的七种写法

    Java 单例模式的七种写法 第一种(懒汉,线程不安全) public class Singleton { private static Singleton instance; private Sin ...

  5. java单例模式之懒汉式分析

    转自:http://blog.csdn.net/withiter/article/details/8140338 今天中午闲着没事,就随便写点关于Java单例模式的.其实单例模式实现有很多方法,这里我 ...

  6. Java 单例模式探讨

    以下是我再次研究单例(Java 单例模式缺点)时在网上收集的资料,相信你们看完就对单例完全掌握了 Java单例模式应该是看起来以及用起来简单的一种设计模式,但是就实现方式以及原理来说,也并不浅显哦. ...

  7. 单例模式:Java单例模式的几种写法及它们的优缺点

    总结下Java单例模式的几种写法: 1. 饿汉式 public class Singleton { private static Singleton instance = new Singleton( ...

  8. 9种Java单例模式详解(推荐)

    单例模式的特点 一个类只允许产生一个实例化对象. 单例类构造方法私有化,不允许外部创建对象. 单例类向外提供静态方法,调用方法返回内部创建的实例化对象.  懒汉式(线程不安全) 其主要表现在单例类在外 ...

  9. 你真的理解了java单例模式吗?讲别人都忽略的细节!

    前言:老刘这篇文章敢做保证,java的单例模式讲的比大多数的技术博客都要好,讲述别人技术博客都没有的细节!!! 1 java单例模式 直接讲实现单例模式的两种方法:懒汉式和饿汉式,单例模式的概念自己上 ...

  10. Java 单例模式详解

    概念: java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例.饿汉式单例.登记式单例三种. 单例模式有一下特点: 1.单例类只能有一个实例. 2.单例类必须自己自己创建自己的唯一实例. ...

随机推荐

  1. C#创建IIS站点及相应的应用程序池,支持IIS6.0+Windows Server 2003. 使用Builder设计模式

    测试项目结构: PS:IIS6UtilsBuilder, IIS7UtilsBuilder,IISUtilsBuilder以及IISDirector为Builder设计模式实现的核心代码.Progra ...

  2. Javascript 面向对象(共有方法,私有方法,特权方法,静态属性和方法,静态类)示例讲解

    一,私有属性和方法 私有方法:私有方法本身是可以访问类内部的所有属性(即私有属性和公有属性),但是私有方法是不可以在类的外部被调用. <script> /* * 私有方法:私有方法本身是可 ...

  3. 变量类型、构造器、封装以及 LeetCode 每日一题

    1.成员变量和局部变量 1.1成员变量和局部变量定义 成员变量指的是类里面定义的变量(field),局部变量指的是在方法里定义的变量. 成员变量无须显示初始化,系统会自动在准备阶段或创建该类的实例时进 ...

  4. java--基本数据类型的转换(强制转换)

    强制类型的转换 规则: 1.执行算术运算时,低类型(短字节)可以转换为高类型(长字节):例如: int型转换成double型,char型转换成int型等等. 就是用强制类型来实现. 3.强制类型转换语 ...

  5. headfirst设计模式(6)—单例模式

    前言 这一章的课题看起来就很和蔼可亲了,比起前面绕的我不要不要的工厂模式,那感觉真是太好了,但是正是因为简单,那么问题就来了,我怎么才能把这个东西叙述清楚?怎么样才能老少咸宜呢? 如何能够在把这个东西 ...

  6. 责任链模式 职责链模式 Chain of Responsibility Pattern 行为型 设计模式(十七)

    责任链模式(Chain of Responsibility Pattern) 职责链模式 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系 将这些对象连接成一条链,并沿着这 ...

  7. Snapde电子表格支持的文件格式

    Snapde,一个专门为编辑超大型数据量CSV文件而设计的单机版电子表格软件:它运行的速度非常快,反应非常灵敏.那么它支持哪些文件格式呢? 1.CSV文件格式,是一种以逗号分隔列.以回车分隔行的文本文 ...

  8. Ajax - Apache安装配置

    apache安装配置 1.安装wamp2.配置根路径3.默认的网站根路径是安装目录的www子目录,如果不想使用默认目录,可以自己配置.配置方式如下: --找到文件wamp\bin\apache\Apa ...

  9. git排除插件(.ignore)配置

    # Created by .ignore support plugin (hsz.mobi) ### Maven template target/ ### JetBrains template # C ...

  10. 阿里云CentOS安装PostgreSQL

    在PostgreSQL官方文档:https://www.postgresql.org/download/linux/redhat/ 有选项和说明 1.检查有没安装:rpg -ga | grep pos ...