`

单例模式与多线程的关系

阅读更多


package test;


public class Tiger6 {
static class Inner {
private static Inner instance = null;
private Inner() { //每调用一次构造函数,打印一条消息。
System.out.println("create a Inner object!");
}
public static Inner getInstance() {
if (instance == null) {
instance = new Inner();
}
return instance;
}
}
public static void main(String[] args) {
Thread[] ts = new Thread[100];
for (int i = 0; i < ts.length; i++) {
ts[i] = new Thread(
new Runnable() {
public void run() {
Inner.getInstance();
}
}
);
}
for (Thread t : ts) {
t.start();
}
}
}

结果:

create a Inner object!
create a Inner object!
create a Inner object!

显然,结果是违反单例模式要求的。

现在在Inner.getInstance()方法上加上synchronized。

结果:

create a Inner object!

当然还有另外一种办法:

public static Inner getInstance() {

synchronized(Inner.class) {

if (instance == null) {
instance = new Inner();
}

}

return instance;
}

分析:通过上面这种办法,可以控制在同一时刻上,只允许有一个线程访问到变量instance。

return instance;
}

分析:通过上面这种办法,可以控制在同一时刻上,只允许有一个线程访问到变量instance。

当然,只有对懒汉式单例模式才有这个问题。对于饿汉式单例模式,Inner对象在类装载时就被创建。

分享到:
评论

相关推荐

    多线程单例模式并发访问

    ### 多线程单例模式并发访问 #### 一、多线程基础概念 在讨论多线程单例模式及并发访问之前,我们先来了解一些基本概念。 **进程**和**线程**是计算机科学中的两个核心概念,它们之间的关系紧密而复杂。 - **进程...

    Qt多工程调用单例实现,带线程锁

    在本文中,我们将深入探讨如何在Qt环境中使用多工程调用单例模式,并结合线程锁来确保数据管理的一致性...通过学习这个案例,开发者可以掌握如何在Qt中正确设计和使用单例模式,以及如何在多线程环境下保证数据一致性。

    设计模式 中的 单例模式和观察者模式

    观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式广泛应用于事件处理、发布/订阅系统等。在Java中,可以使用`...

    单例模式的要点及模式

    - 单例模式会隐藏类的实例关系,增加代码的复杂性和理解难度。 - 在某些情况下,如果需要多个实例,单例模式会成为反模式。 总之,单例模式是一种常用的创建型设计模式,它在特定场景下能够有效提高程序效率,但...

    设计模式之单例模式Java实现和类设计图

    在设计图中,单例模式会显示一个类(Singleton)和一个指向该类的静态引用,而装饰模式则会展示组件、装饰器和它们之间的继承关系。 通过熟练掌握并应用单例模式和装饰模式,开发者可以在保证代码可读性、可维护性...

    单例模式.doc

    为了解决懒汉式在多线程环境下的问题,可以通过对`newInstance()`方法加上`synchronized`关键字来实现线程安全的懒汉式单例模式。 **示例代码:** ```java public class Singleton { // 定义一个当前类的实例 ...

    设计模式_单例模式.zip

    另外,单例模式可能导致程序难以测试,因为它隐藏了依赖关系。在某些情况下,可以考虑使用依赖注入或工厂模式作为替代方案。 总结来说,单例模式是一种常见的设计模式,用于控制类的实例化过程,保证在整个系统中...

    发布订阅者模式实现(内含单例模式、缺省适配器模式)

    - 实现单例模式通常有懒汉式、饿汉式和双重检查锁定等方式,选择哪种方式取决于线程安全需求和性能考虑。 3. **缺省适配器模式(Default Adapter Pattern)**: - 当一个类需要使用某个接口,但不希望实现所有的...

    配置文件+类加载器(单例模式)连接数据库

    这是因为单例模式能防止创建多个不必要的数据库连接,从而降低内存开销和并发问题。数据库连接池(如C3P0、HikariCP或Apache DBCP)就是一种实现方式,它们管理一组预配置的连接,供多个线程共享,用完后可复用或...

    42丨单例模式(中):我为什么不推荐使用单例模式?又有何替代方案?1

    - 单例模式使得依赖关系变得隐晦,因为它们通常通过静态方法直接调用,而不是通过构造函数或方法参数显式传递。这降低了代码的可读性和可维护性。 3. **对代码扩展性不友好**: - 一旦类设计为单例,就意味着无法...

    Java聊天室 观察者模式和单例模式

    单例模式避免了多线程环境下的资源冲突,保证了所有客户端都与同一服务器实例交互。Java中实现单例模式的方法有多种,如懒汉式(线程不安全)、饿汉式(静态初始化)、双重检查锁定(DCL)等,其中DCL是推荐的线程...

    Objective C 单例模式设计源码

    平时,我们常用单例模式的地方通常是多线程。 因为Objective C传承了Smalltalk语言,所以在Objective C中实现单例模式和C++和C#以及Java都不太一样。因为要保证类型对象的单一性,所以就要考虑Objective C在实例化...

    Java常用的3中设计模式代码即工厂模式、单例模式、观察者模式demo

    在Java中,实现单例模式有多种方式,如懒汉式(线程不安全)、饿汉式(静态常量)、双重检查锁定(DCL)等。其中,`Singleton.java`通常表示使用DCL实现的单例,它既保证了线程安全,又避免了不必要的同步开销。 ``...

    [创建型模式] 单例模式的理解

    在实际应用中,单例模式也有一些潜在的问题,如妨碍了多线程并行测试,使得扩展困难,以及违反了开闭原则。因此,在某些场景下,如微服务架构中,可能需要避免过度依赖单例。 文件"单例模式-概念图.pdf"可能包含了...

    单例设计模式_单例设计模式_

    - 降低了模块间的耦合度:通过单例模式,模块之间的依赖关系变得更为清晰,便于管理。 - 控制实例化过程:可以控制何时以及如何创建对象,特别是在初始化过程复杂或需要特定条件的情况下。 缺点: - 扩展困难:如果...

    singleTon单例模式的创建

    ### SingleTon单例模式的创建 #### 一、单例模式概述 单例模式是一种常用的软件设计模式,它确保一个类只有一个实例,并提供一个全局访问点。这种模式通常用于那些需要频繁实例化然后销毁的对象,或者创建对象需要...

    C#单例模式

    ### C#中的单例模式详解 #### 单例模式简介 单例模式是软件工程设计模式中的一种,其核心在于确保...然而,过度使用单例也可能带来隐藏的依赖关系和测试困难,因此,在设计时应权衡利弊,合理选择是否使用单例模式。

    设计模式-单例设计模式

    - **注意线程安全**:在多线程环境下,必须确保实例化的安全性。 #### 争议点 1. **单例对象是否会被垃圾回收**:在正常情况下,只要静态引用未被清除,单例对象就不会被垃圾回收。 2. **JVM中是否会存在多个单例**...

    深入浅出设计模式之单件模式

    - 优点:避免了多线程下的同步问题,提高了运行效率。 - 缺点:可能会造成资源浪费,尤其是在实例创建成本较高时。 #### 四、单件模式的应用场景 1. **日志对象**:单例模式可以用于管理全局的日志记录器,确保...

Global site tag (gtag.js) - Google Analytics