// 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中懒汉单例设计模式线程安全测试,单例设计模式的测试
在多线程环境下,线程安全的单例模式尤为重要,因为如果不正确实现,可能会导致多个线程同时创建多个实例,违反了单例模式的基本原则。 在Java中,单例模式通常有以下几种实现方式: 1. 饿汉式(静态常量): ...
C++11引入了新的特性,如std::mutex和std::call_once,使得实现线程安全的单例模式变得更加容易和高效。 首先,我们需要理解C++11中的线程模型。在C++11之前,C++标准并不直接支持多线程编程。C++11引入了 `...
综上所述,线程安全的单例模式实现是一个复杂的过程,需要综合考虑效率和线程安全两方面的因素。通过上述几种不同的实现方式,我们可以根据实际需求选择最适合的一种。其中,双重检查锁定因其较高的性能和线程安全性...
Java 单例模式线程安全问题详解 Java 单例模式线程安全问题是指在 Java 中实现单例模式时,如何确保线程安全的问题。单例模式是指在整个应用程序生命周期中,只有一个实例存在的设计模式。这种模式可以提高性能,...
使用"懒汉模式"与"饿汉模式"实现c++的单例模式,并且确保了单例模式的第一次实例化的线程安全,以及程序结束时,单例对象的资源收回,以防内存资源的泄漏
单例模式三种线程安全的表达方式,其中枚举方式的单例是最安全的
在这个特定的场景中,我们讨论的是一个实现了单例模式的日志类,该类专为多线程环境设计,具备日志等级控制、精确的时间戳以及可变长参数和标准格式化输出的功能。 首先,让我们深入了解单例模式。单例模式的主要...
总结来说,Python实现线程安全的单例模式通常需要结合装饰器和线程锁来确保在多线程环境下只有一个实例存在。这里的实现方式是定义了两个装饰器,`Singleton`用于创建单例,`synchronized`用于实现线程同步。通过...
总结起来,多线程环境下的单例模式实现需要注意线程安全问题,尤其是懒汉式单例,需要采取适当的同步措施来防止多线程环境下的实例化问题。此外,对于不同场景的需求,可以选择不同的实现方式来优化性能和资源使用。
在项目中,`src`目录可能包含了这些设计模式的源码示例,可以用来学习和理解如何实际应用单例模式和工厂模式。通过阅读和分析这些代码,你可以更深入地理解这两种模式的实现细节及其在实际开发中的作用。同时,也...
内容概要:本文详尽地阐述了 C# 中单例模式的设计思想以及其实现方式,并且特别针对单例模式的线例安全提供了多种解决方案,包括锁(lock),最终给出了一段非线程安全和一段线程安全版本的代码供参考。 适合人群:C# ...
单例模式是软件设计模式中的一种经典模式,其主要目的是确保一个类只有一个实例,并提供一个全局访问点。...在实际应用中,开发者应根据项目需求选择合适的单例实现,并注意线程安全和反序列化等问题。
实现单例模式主要有两种方式:饿汉式和懒汉式。 ### **饿汉式单例模式** 饿汉式单例模式在类加载时就完成了实例化,因此也称为静态初始化。这种方式保证了线程安全,但可能会造成不必要的资源浪费,因为即使未使用...
饿汉单例模式是线程安全的,因为它在类加载时就完成了实例化,所以不会存在多个线程同时创建多个实例的情况。这种模式在多线程环境下性能较好,但可能导致不必要的内存占用。 2. **懒汉单例模式**:也称为延迟初始...
在Java中,有多种实现单例模式的方法,每种都有其特点和适用场景。接下来,我们将深入探讨这些实现方式。 首先,我们来看**懒汉式(Lazy Initialization)**。这种实现方式是在类被首次请求时才创建单例对象,延迟...
- 难以解耦,单例模式使得依赖它的类紧密耦合,不易于重构和扩展。 在实际开发中,应谨慎使用单例模式,避免过度使用导致代码维护难度增加。在某些场景下,如依赖注入和微服务架构中,可能需要避免使用单例,以保持...
在Java中,`枚举`也被推荐作为实现单例的优雅方式,因为枚举天然具有线程安全和防止反射攻击的优势: ```java public enum SingletonKerriganC { INSTANCE; } ``` 总的来说,单例模式的实现需要考虑线程安全、...
1 教科书里的单例模式 我们都很清楚一个简单的单例模式该怎样去实现:构造函数声明为private或protect防止被外部函数实例化,内部保存一个private static的类指针保存唯一的实例,实例的动作由一个public的类方法...
其中,双检锁和枚举单例是线程安全的,推荐在多线程环境下使用。 ```java // 双检锁/双重校验锁(DCL,即 double-checked locking) public class Singleton { private volatile static Singleton instance; ...