原文出自:http://www.javaworld.com/community/node/7692
There are two ways singletons are created using the Double Check Locking and the Holder Idiom for lazy loading. Both of them create a static singleton object which does not help garbage collection much.
In search of a new way to create singleton without using static object came across this solution which gets rid of creating object in static way and also helps garbage collection as we wrap singleton object with Soft Reference.
package com.singleton;
import java.lang.ref.SoftReference;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
/**
* SoftSingleton Idiom It does not create a static object and also creates a
* soft reference and thus in turn helps garbage collection.
*
* @author ajitkoti
*
*/
public class SingletonTest {
// This List would always contain only 1 Singleton object
private static List<SoftReference<SingletonTest>> singletonList = new ArrayList<SoftReference<SingletonTest>>();
// very imp to keep the permit as 1 if not other threads would acquire and
// create the Singleton
private static Semaphore semaphore = new Semaphore(1);
private SingletonTest() {
System.out.println("Hi I am a Singleton Just born");
}
/**
* Returns an instance of SingletonTest
*
* @return
*/
public static SingletonTest getInstance() {
if (singletonList.isEmpty() || singletonList.get(0).get() == null) {
try {
semaphore.acquire();
// Double check so that if the second thread acquires the permit
// ,
// while first Thread has all ready created the Singleton
if (singletonList.isEmpty()
|| singletonList.get(0).get() == null) {
// Only 1 Thread will ever enter here and create the
// Singleton
singletonList.add(new SoftReference<SingletonTest>(
new SingletonTest()));
}
semaphore.release();
} catch (InterruptedException e2) {
System.err.println("Could not create Singleton - "
+ e2.getMessage());
Thread.currentThread().interrupt(); // restore the interrupt
}
}
return singletonList.get(0).get();
}
/**
* Main method to test the Singleton creation
*
* @param args
*/
public static void main(String[] args) {
int noOfThreads = 1000;
ExecutorService executor = Executors.newFixedThreadPool(noOfThreads);
for (int i = 0; i < noOfThreads; i++) {
executor.execute(new Runnable() {
public void run() {
System.out.println("Calling and Creating singletonTest"
+ SingletonTest.getInstance());
}
});
}
executor.shutdown();
}
}
分享到:
相关推荐
在Qt的Qml环境中,单例模式是一种设计模式,它允许在整个应用程序中创建一个全局访问点,确保某个类只有一个实例存在。...了解和熟练运用Singleton模式,对于提升Qt Qml应用的设计质量和性能至关重要。
单例模式是软件设计模式中的一种,它的核心思想是确保一个类在整个系统中只有一个实例,并提供一个...在实际开发中,我们需要根据具体需求选择合适的实现方式,同时注意线程安全问题,确保单例模式的正确性和稳定性。
单例模式是软件设计模式中的一种,它保证一个类只有一个实例,并提供一个全局访问点。在C++中,实现单例模式有多种方法,我们将会深入探讨这一模式的原理、优缺点以及如何在实际编程中应用。 单例模式的核心在于...
### 单例模式 Singleton Pattern #### 概述 单例模式是一种常见的设计模式,属于创建型模式之一。这种模式的核心在于确保某个类只有一个实例存在,并且提供一个全局访问点来获取该实例。单例模式在Java开发中尤其...
### Singleton Pattern 单例模式应用详解 #### 一、单例模式概述 单例模式(Singleton Pattern)是一种常用的软件设计模式,在系统中确保某个类只有一个实例,并提供一个全局访问点。这种模式通常用于控制资源的...
单例模式是软件设计模式中的一种经典模式,它在许多场景下被广泛使用,尤其是在需要全局唯一实例的情况下。本文将深入探讨单例模式的概念、作用、实现方式以及其在实际编程中的应用。 单例模式的核心思想是确保一个...
实现单例模式主要有两种方式:饿汉式和懒汉式。 ### **饿汉式单例模式** 饿汉式单例模式在类加载时就完成了实例化,因此也称为静态初始化。这种方式保证了线程安全,但可能会造成不必要的资源浪费,因为即使未使用...
单例模式是软件设计模式中的一种,它保证一个类只有一个实例,并提供一个全局访问点。在C#中,单例模式常用于管理共享资源或控制类的实例化过程,以提高性能、节约系统资源,特别是在整个应用程序生命周期内只需要一...
C++11引入了新的特性,如std::mutex和std::call_once,使得实现线程安全的单例模式变得更加容易和高效。 首先,我们需要理解C++11中的线程模型。在C++11之前,C++标准并不直接支持多线程编程。C++11引入了 `...
在Java中,有多种实现单例模式的方法,每种都有其特点和适用场景。接下来,我们将深入探讨这些实现方式。 首先,我们来看**懒汉式(Lazy Initialization)**。这种实现方式是在类被首次请求时才创建单例对象,延迟...
单例模式是软件设计模式中的一种,属于创建型模式,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下都非常有用,例如管理共享资源、配置对象或者缓存服务等。 单例模式的核心...
C++实现Singleton单例模式 本文档将详细介绍如何使用C++语言实现设计模式中的单例模式。单例模式是一种常用的设计模式,它可以确保一个类只能实例化一次。 单例模式的定义: 单例模式是一种创建型模式,它可以确保...
在给定的标题和描述中,我们关注的是两种重要的设计模式:单例模式和观察者模式。 首先,让我们深入了解单例模式。单例模式是一种确保一个类只有一个实例,并提供全局访问点的设计模式。这种模式在资源管理、缓存、...
下面将详细介绍七种常见的单例模式实现方式,并结合多线程环境和反序列化测试进行讨论。 1. **饿汉式单例**: 这是最简单的单例实现,它在类加载时就创建了实例,因此是线程安全的。 ```java public class ...
单例模式是一种设计模式,它控制了类的实例化过程,确保一个类只有一个实例,并提供一个全局访问点。在PHP中,单例模式通常用于管理共享资源,如数据库连接、缓存系统或日志记录,因为这些场景下,创建多个实例可能...
单例模式(Singleton)是设计模式中最简单也是最有争议的一个模式。它主要解决的问题是确保一个类仅有一个实例,并提供一个全局访问点。单例模式适用于那些需要全局访问的场景,比如线程池、缓存、配置对象等。单例...
单例模式和工厂模式是两种常见的软件设计模式,在面向对象编程中扮演着重要的角色。它们都是为了解决特定的问题而提出的解决方案,但有着不同的应用场景和设计思路。 **单例模式** 是一种限制类实例化次数的模式,...
在Java应用中,单例对象能保证在一个...3、有些像交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个的话,系统完全乱了,只有使用单例模式,才能保证核心交易服务器独立控制整个流程。 CSDN代码的详细解释。
单例模式是软件设计模式中的一种,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下都非常有用,比如控制资源的唯一性、管理共享配置或者创建昂贵的对象时避免频繁创建销毁。 ...
通过`SingletonFactory`工具类,我们不仅可以方便地使用各种单例模式,还可以对自定义的单例进行统一管理和访问,提高了代码的可维护性和灵活性。在实际开发中,应根据项目需求选择适合的单例实现方式,以保证代码的...