// 1.单例分两种:
// 饿汉式 和 懒汉式
// 饿汉式:
package com.chess.test;
/**
*
* 饿汉模式的单例
* @author chess
*
*/
public final class SignleObjectHungry
{
private static SignleObjectHungry signleObjHun = new SignleObjectHungry();
private SignleObjectHungry()
{
}
public static SignleObjectHungry getInstance()
{
return signleObjHun;
}
}
// 懒汉式
package com.chess.test;
/**
* 懒汉式单例模式
* @author chess
*
*/
public final class SingleObjectLazy
{
private static SingleObjectLazy signleObjLazy = null;
private SingleObjectLazy()
{
}
public static SingleObjectLazy getInstance()
{
if(null == signleObjLazy)
{
signleObjLazy = new SingleObjectLazy();
}
return signleObjLazy;
}
}
// 由于单例存在线程安全问题,所以要解决的话
// 对于
// 饿汉式线程安全
package com.chess.test;
/**
* 饿汉式单例线程安全
* @author chess
*
*/
public final class SingleObjectHungryAndThreadSafe
{
private static SingleObjectHungryAndThreadSafe signleObj = new SingleObjectHungryAndThreadSafe();
private SingleObjectHungryAndThreadSafe()
{
}
/**
* 加同步锁方法实现线程安全
*
* 此方法存在 性能开销 大
*
* @return
*/
public synchronized static SingleObjectHungryAndThreadSafe getInstance()
{
return signleObj;
}
}
//懒汉式线程安全
package com.chess.test;
/**
* 懒汉式单例 和 线程安全
*
* @author chess
*
*/
public final class SingleObjectLazyAndThreadSafe
{
private static SingleObjectLazyAndThreadSafe singleObj = null;
private SingleObjectLazyAndThreadSafe()
{
}
// public synchronized static SingleObjectLazyAndThreadSafe getInstance()
// {
// if(null == singleObj)
// {
// singleObj = new SingleObjectLazyAndThreadSafe();
// }
//
// return singleObj;
//
// }
// 细化粒度,提高性能 提高线程并发度
//双重检查锁机制
public static SingleObjectLazyAndThreadSafe getInstance()
{
if (null == singleObj)
{
synchronized (SingleObjectHungryAndThreadSafe.class)
{
if (null == singleObj)
{
singleObj = new SingleObjectLazyAndThreadSafe();
}
}
}
return singleObj;
}
//至此 线程安全 已经感觉狠完美了。
//多线程中,如果 线程A 执行到第 30 行,此时对象为空,则进入初始化对象,
// 然而初始化对象需要时间,
// 此时 线程B 也执行到第 30 行 , 此时对象已经初始化未完成, 但是地址已经存在。
// 则 线程B 将获取一个未完成的 对象。
}
//完美的解决方案
package com.chess.test;
/**
* 单例模式线程安全的完美状态
* 新的设计模式
* 使用内部类 JLS会保证这个类的线程安全
* (完全使用 JAVA 虚拟机的机制进行同步保证,且 没有同步的关键字)
* @author chess
*
*/
public class SingleObjectThreadSafeNoSync
{
/**
* 以内部类实现懒加载(懒汉)
*
* 初始化这个内部类的时候 JLS 保证这个类的线程安全
* @author cWX181783
*
*/
private static class SingletonHolder
{
public final static SingleObjectThreadSafeNoSync singleObject =
new SingleObjectThreadSafeNoSync();
}
public static SingleObjectThreadSafeNoSync getInstance()
{
return SingletonHolder.singleObject;
}
}
分享到:
相关推荐
Java中懒汉单例设计模式线程安全测试,单例设计模式的测试
线程安全的单例模式 线程安全的单例模式 线程安全的单例模式
C++11实现线程安全的单例代码和测试代码,包含singleton.h,main.cpp,希望帮助到大家。
NULL 博文链接:https://javawl.iteye.com/blog/1831804
使用"懒汉模式"与"饿汉模式"实现c++的单例模式,并且确保了单例模式的第一次实例化的线程安全,以及程序结束时,单例对象的资源收回,以防内存资源的泄漏
单例模式三种线程安全的表达方式,其中枚举方式的单例是最安全的
主要介绍了Java 单例模式线程安全问题的相关资料,希望通过本文大家能了解掌握单例模式中线程安全的使用方法,需要的朋友可以参考下
深入浅出:讲解单例模式,多线程安全和并发访问问题.让你轻松应对面试
1 教科书里的单例模式 我们都很清楚一个简单的单例模式该怎样去实现:构造函数声明为private或protect防止被外部函数实例化,内部保存一个private static的类指针保存唯一的实例,实例的动作由一个public的类方法...
主要介绍了python实现线程安全的单例模式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
3.4懒汉式(线程安全,使用同步方法) 9 3.5双重检查实现单例模式 10 3.6使用静态内部类实现单例模式 12 3.7使用枚举类实现单例模式 13 4.单例模式怎么用才合理? 14 4.1测试 14 4.2无边界 15 5.设计模式学习总结: ...
保证一个类只有一个实例,并提供一个访问它的全局访问点,使得系统中只有唯一的一个对象实例,具有线程安全,多线程测试通过。 1.打开日志并创建日志文件夹 默认为程序启动路径 2.清理日志文件下日志数量 默认保留90...
下面小编就为大家带来一篇从C++单例模式到线程安全详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
双重校验锁模式结合了懒汉模式和饿汉模式的优点,既实现了延迟加载,又保证了线程安全。你可以根据需求选择合适的单例模式实现方式。
该资源是多线程并发下的单例模式-源码,几乎包含了所有方式实现的单例模式,并且能够确保在多线程并发下的线程安全性。 读者可结合本人博客 http://blog.csdn.net/cselmu9?viewmode=list 中的《线程并发之单例模式...
Java多线程--解决单例模式中的懒汉式的线程安全问题
单例模式 Singleton 单例模式线程安全问题和拓展
1、掌握单例模式的应用场景。 2、掌握 IDEA 环境下的多...3、掌握保证线程安全的单例模式策略。 4、掌握反射暴力攻击单例解决方案及原理分析。 5、序列化破坏单例的原理及解决方案。 6、掌握常见的单例模式写法。
懒汉式—线程安全:加上synchronize之类保证线程安全的基础上的懒汉模式,相对性能很低,大部分时间并不需要同步 饿汉方式。指全局的单例实例在类装载时构建。 [2] 双检锁式。在懒汉式基础上利用synchronize关键字和...