`
hkme
  • 浏览: 142290 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Singleton安全

阅读更多

单例模式的一般例子:

public class Singleton{

private static Singleton instance = null;

public static  Singleton getInstance(){

if(instance == null){

instance  = new Singleton();

}

return instace;

}

}假设这样一个场景,有两个线程调用Singleton.instance(),首先线程一判断instance是否等于null,判断完后一瞬间虚拟机把线程二调度为运行线程,线程二再次判断instance是否为null,然后创建一个Singleton实例,线程二的时间片用完后,线程一被唤醒,接下来它执行的代码依然是instance = new Singleton();
两次调用返回了不同的对象,出现问题了。
解决方案:(1)类被载入时就初始化这个对象:private static Singleton instance = new Singleton();
JLS(Java Language Specification)中规定了一个类只会被初始化一次,所以这样做肯定是没问题的。

但是如果要实现延迟初始化(Lazy initialization),比如这个实例初始化时的参数要在运行期才能确定
(2)使用synchronized关键字修饰初始化方法:

public synchronized static Singleton getInstace() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}

分享到:
评论

相关推荐

    linux 下线程安全的singleton

    singleton是最常见的设计模式,但是要设计好却是不容易,尤其是多线程的时候,需要考虑线程安全的问题.

    Singleton

    这种方式是线程安全的,且只在Singleton类加载时初始化Singleton实例,因此既解决了懒加载,又避免了同步问题。 ```java public class Singleton { private Singleton() {} private static class Singleton...

    C++完美实现Singleton模式

    ### C++中实现Singleton...在C++中实现Singleton模式时,需要注意的关键点包括但不限于资源管理、线程安全以及如何有效地减少重复代码。正确应用这些技术可以使Singleton模式更加健壮和高效,从而提高整体代码的质量。

    singleton设计模式java实现及对比

    优点:线程安全,因为类加载是线程安全的,所以Singleton实例的创建也是线程安全的。并且由于实例在类加载时就创建,所以不存在多线程下的性能问题。 缺点:Singleton实例在类加载时就被创建,即使可能永远都不会...

    C++ 实现的singleton 模式

    为了进一步提高Singleton的安全性和线程安全性,可以考虑使用线程局部存储(TLS)或互斥锁(mutex)。在多线程环境中,如果没有适当的同步机制,`getInstance()`可能会在不同线程中同时创建多个实例。在C++11及更高...

    Singleton Pattern 源码

    单例模式(Singleton Pattern)是软件设计模式中的一种,它保证一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下非常有用,比如控制资源的唯一性、全局配置对象或者缓存服务等。本篇文章将深入探讨...

    linux下线程安全的singleton模板

    在Linux环境下,线程安全的Singleton模板是一种至关重要的设计模式,尤其在多线程编程中。Singleton模式的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在系统资源管理、缓存、日志记录等方面...

    Singleton 单例模式

    Singleton 单例模式是软件设计模式中的一种,它限制了类的实例化过程,确保一个类在整个系统中只有一个实例存在。这种模式常用于系统资源管理,比如数据库连接、线程池或者缓存服务等,因为这些资源往往需要全局共享...

    Java线程安全的Singleton模式:深入分析与实现

    线程安全的Singleton模式对于多线程环境尤为重要,因为它可以防止多个线程同时创建多个实例。本文将详细介绍如何在Java中创建线程安全的Singleton,包括几种常见的实现方式和最佳实践。 在Java中创建线程安全的...

    (创建型模式)Singleton模式

    通过枚举类型实现Singleton是最安全且推荐的方法,既能保证线程安全,又避免了反射攻击。 ```java public enum Singleton { INSTANCE; public void whateverMethod() {} } ``` 除了上述实现方式,还需要注意...

    单例模式Singleton

    单例模式(Singleton Pattern)是一种常用的软件设计模式,它的核心思想是确保一个类在整个应用程序中只有一个实例存在,并提供一个全局访问点来获取这个实例。这种模式在很多场景下非常有用,比如管理系统资源、...

    SingleTon的模板(template)化应用

    文件“110425-iceSingeTom”可能是某个关于冰冻单例(Frozen Singleton)或者基于C++标准库`std::call_once`实现的线程安全单例的示例,这种实现方式可以避免在多线程环境中多次实例化。冰冻单例是一种特殊的单例,...

    Java常用设计模式(SingleTon、FactoryMethod、AbstractFactory)

    Java中常使用双重检查锁定(Double-Check Locking)或枚举方式来实现线程安全的单例。 ```java // 双重检查锁定示例 public class Singleton { private volatile static Singleton instance; private Singleton...

    Java的Singleton模式代码(免资源分)

    ### Java的Singleton模式详解 #### 一、Singleton模式概述 Singleton模式是一种常用的设计模式,在Java中主要用于确保一个类只有一个实例,并提供一个全局访问点。这种模式对于管理共享资源(如数据库连接池、...

    singleton面试题转

    - **线程安全**:在多线程环境下,正确实现的Singleton模式可以保证线程安全。 缺点: - **违反了单一职责原则**:Singleton模式既负责创建自己的实例,又负责管理自己的实例,职责过多。 - **难以测试**:由于...

    Loki singleton

    Loki 库中的 Singleton 模板类提供了标准的单例实现,它通过延迟初始化(lazy initialization)来保证线程安全,避免了多线程环境下可能产生的竞态条件。延迟初始化意味着只有当第一次请求单例实例时,才会创建该...

    单例实现源码singleton-C++

    以下是对"单例实现源码singleton-C++"的详细解析。 1. **静态成员变量法** 这是最常见的单例实现方式。在类中定义一个静态成员变量,该变量保存唯一的实例。例如: ```cpp class Singleton { public: static ...

    java Singleton单例模式

    Java中的Singleton(单例模式)是一种常用的软件设计模式,它保证了类只有一个实例,并提供一个全局访问点。这种模式在需要频繁创建和销毁对象的场景中特别有用,因为它可以节省系统资源,例如数据库连接或者线程池...

    SingletonTemplate

    2. 静态内部类或者枚举:这是推荐的实现单例的方式,能保证线程安全且避免了同步开销。 3. 单例实例:通常是一个私有的静态变量,存储类的唯一实例。 4. 获取实例的方法:公开一个静态方法,返回类的唯一实例。调用...

Global site tag (gtag.js) - Google Analytics