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中正确设计和使用单例模式,以及如何在多线程环境下保证数据一致性。
观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式广泛应用于事件处理、发布/订阅系统等。在Java中,可以使用`...
- 单例模式会隐藏类的实例关系,增加代码的复杂性和理解难度。 - 在某些情况下,如果需要多个实例,单例模式会成为反模式。 总之,单例模式是一种常用的创建型设计模式,它在特定场景下能够有效提高程序效率,但...
在设计图中,单例模式会显示一个类(Singleton)和一个指向该类的静态引用,而装饰模式则会展示组件、装饰器和它们之间的继承关系。 通过熟练掌握并应用单例模式和装饰模式,开发者可以在保证代码可读性、可维护性...
为了解决懒汉式在多线程环境下的问题,可以通过对`newInstance()`方法加上`synchronized`关键字来实现线程安全的懒汉式单例模式。 **示例代码:** ```java public class Singleton { // 定义一个当前类的实例 ...
另外,单例模式可能导致程序难以测试,因为它隐藏了依赖关系。在某些情况下,可以考虑使用依赖注入或工厂模式作为替代方案。 总结来说,单例模式是一种常见的设计模式,用于控制类的实例化过程,保证在整个系统中...
- 实现单例模式通常有懒汉式、饿汉式和双重检查锁定等方式,选择哪种方式取决于线程安全需求和性能考虑。 3. **缺省适配器模式(Default Adapter Pattern)**: - 当一个类需要使用某个接口,但不希望实现所有的...
这是因为单例模式能防止创建多个不必要的数据库连接,从而降低内存开销和并发问题。数据库连接池(如C3P0、HikariCP或Apache DBCP)就是一种实现方式,它们管理一组预配置的连接,供多个线程共享,用完后可复用或...
- 单例模式使得依赖关系变得隐晦,因为它们通常通过静态方法直接调用,而不是通过构造函数或方法参数显式传递。这降低了代码的可读性和可维护性。 3. **对代码扩展性不友好**: - 一旦类设计为单例,就意味着无法...
单例模式避免了多线程环境下的资源冲突,保证了所有客户端都与同一服务器实例交互。Java中实现单例模式的方法有多种,如懒汉式(线程不安全)、饿汉式(静态初始化)、双重检查锁定(DCL)等,其中DCL是推荐的线程...
平时,我们常用单例模式的地方通常是多线程。 因为Objective C传承了Smalltalk语言,所以在Objective C中实现单例模式和C++和C#以及Java都不太一样。因为要保证类型对象的单一性,所以就要考虑Objective C在实例化...
在Java中,实现单例模式有多种方式,如懒汉式(线程不安全)、饿汉式(静态常量)、双重检查锁定(DCL)等。其中,`Singleton.java`通常表示使用DCL实现的单例,它既保证了线程安全,又避免了不必要的同步开销。 ``...
在实际应用中,单例模式也有一些潜在的问题,如妨碍了多线程并行测试,使得扩展困难,以及违反了开闭原则。因此,在某些场景下,如微服务架构中,可能需要避免过度依赖单例。 文件"单例模式-概念图.pdf"可能包含了...
- 降低了模块间的耦合度:通过单例模式,模块之间的依赖关系变得更为清晰,便于管理。 - 控制实例化过程:可以控制何时以及如何创建对象,特别是在初始化过程复杂或需要特定条件的情况下。 缺点: - 扩展困难:如果...
### SingleTon单例模式的创建 #### 一、单例模式概述 单例模式是一种常用的软件设计模式,它确保一个类只有一个实例,并提供一个全局访问点。这种模式通常用于那些需要频繁实例化然后销毁的对象,或者创建对象需要...
### C#中的单例模式详解 #### 单例模式简介 单例模式是软件工程设计模式中的一种,其核心在于确保...然而,过度使用单例也可能带来隐藏的依赖关系和测试困难,因此,在设计时应权衡利弊,合理选择是否使用单例模式。
- **注意线程安全**:在多线程环境下,必须确保实例化的安全性。 #### 争议点 1. **单例对象是否会被垃圾回收**:在正常情况下,只要静态引用未被清除,单例对象就不会被垃圾回收。 2. **JVM中是否会存在多个单例**...
- 优点:避免了多线程下的同步问题,提高了运行效率。 - 缺点:可能会造成资源浪费,尤其是在实例创建成本较高时。 #### 四、单件模式的应用场景 1. **日志对象**:单例模式可以用于管理全局的日志记录器,确保...