//单例模式分为两种:懒汉式和饿汉式,那么接下来分别对这两种的一般写法和谨慎写法代码示例
懒汉式
一般写法
public class Singleton {
private Singleton(int a){
System.out.print(a);
}
private static Singleton instance=null;
public static Singleton getinstance(){
if(instance==null)
instance=new Singleton(6);
return instance;
}
}
但是目前存在两个线程A和B,当A判断完instance为null时,虚拟机把CPU资源判给B,由于instance此时还是为null,所以B执行instance=new Singleton(6),而此时切换到A线程时,A继续执行instance=new Singleton(6),这样就出现了问题。于是
改进写法:
public class Singleton {
private Singleton(int a){
System.out.print(a);
}
private static Singleton instance=null;
public static Singleton getinstance(){
if(instance==null)
synchronized (Singleton.class) {
if (instance==null) {
instance=new Singleton(6);
}
}
return instance;
}
}
这样采用了同步机制又提高效率,但是还是存在一个问题,因为instance=new Singleton(6)是非原子操作(原子操作的意思就是这条语句要么就被执行完,要么就没有被执行过,不能出现执行了一半这种情形),这句代码在编译之后进入虚拟机中执行的对应汇编代码可以发现,有三个步骤,分别为:
1.给Singleton实例分配内存;
2.初始化Singleton构造器;
3.将instance对象指向Singleton实例分配的内存空间(此时instance就为非null了)
在JDK1.5之前,第二步和第三步的顺序是无法保证的,但是在JDK1.5之后,就基本没有问题,所以此种改进写法是一种相对比较完美的写法了
饿汉式
一般写法:
public class Singleton {
private Singleton(int a){
System.out.print(a);
}
private static Singleton instance = new Singleton(6);
public static Singleton getinstance() {
return instance;
}
}
但是由于此种写法classloader加载类之后的第一时间就会创建Singleton实例,所以如果这个Singleton实例一些参数需要在getinstance之后通过调用一些配置文件才可以获得,那么就会存在弊端。
改进写法:
public class Singleton {
private Singleton(int a){
System.out.print(a);
}
private static class SingletonF{
static final Singleton instance=new Singleton(5);
}
public static Singleton getinstance(){
return SingletonF.instance;
}
}
这种写法仍能使用JVM机制保证了线程安全,由于SingletonF是私有的,只有getinstance才能访问Singleton实例,因此它是懒汉式的。同时它在取实例的时候不会进行同步,所以没有性能问题,也不依赖于JDK版本。目前来说这种是最优的解决方案。
单例模式的应用场景有数据库的连接,采用数据库连接池,而关闭或者打开数据库连接所引起的效能损耗是非常昂贵的,所以采用单例模式大大降低了这种损耗。
饿死了,中午还没吃饭
分享到:
相关推荐
单例模式是一种设计模式,它的主要目标是确保一个类只有一个实例,并提供一个全局访问点。在软件工程中,单例模式常用于控制资源的共享,比如数据库连接池、线程池或者日志系统等,这些资源通常需要全局唯一且高效地...
单例模式是软件设计模式中的一种,它保证一个类只有一个实例,并提供一个全局访问点。在C#中,单例模式常用于管理共享资源或控制类的实例化过程,以提高性能、节约系统资源,特别是在整个应用程序生命周期内只需要一...
Java设计模式-单例模式详解 单例模式是 Java 设计模式中的一种常用的设计模式,旨在保证一个类仅有一个实例,并提供一个访问它的全局访问点。单例模式的目的是为了保证在一个进程中,某个类有且仅有一个实例。 ...
Java设计模式之单例模式详解 一、单例模式概览 单例模式(Singleton Pattern)是面向对象设计模式中的一种,属于创建型模式。它确保一个类仅有一个实例,并提供一个全局访问点来访问该实例。单例模式的核心在于控制...
设计模式之单例模式详解 单例模式是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。 单例模式的实现主要是...
### Java多线程单例模式详解 #### 一、单例模式概述 单例模式(Singleton Pattern)是一种常用的软件设计模式,它确保一个类仅有一个实例,并提供一个全局访问点。这种模式通常用于那些需要频繁实例化然后销毁的...
单例模式的实现机制,并发情况下的单例模式的存在问题及解决方法,无锁的线程安全单例模式
单例模式是软件开发中一种非常重要的设计模式,它确保一个类只有一个实例,并提供一个全局访问点。在JavaScript这样的动态语言中,单例模式的实现方式很多样,而且可以非常灵活。下面,我们就来深入探讨单例模式在...
单例模式的核心在于限制类的实例化过程,通过私有化构造方法并提供一个静态公共方法来获取唯一实例。在OC中,我们通常使用分类(Category)来隐藏初始化方法,同时利用GCD(Grand Central Dispatch)或NSLock来确保...
内容概要:本文详尽地阐述了 C# 中单例模式的设计思想以及其实现方式,并且特别针对单例模式的线例安全提供了多种解决方案,包括锁(lock),最终给出了一段非线程安全和一段线程安全版本的代码供参考。 适合人群:C# ...
Java单例模式是一种常见的设计模式,它用于控制类的实例化过程,确保一个类在整个应用程序中只有一个实例存在。这种模式通常用于管理共享资源或者需要频繁创建和销毁的对象,以节省系统资源并提供全局访问点。 单例...
在软件工程中,单例模式是创建型设计模式之一,其目的是确保一个类仅有一个实例,并提供一个全局访问点。Java语言中的单例模式实现有多种方式,包括饿汉式、懒汉式和登记式单例。不同的实现方式适应不同的场景和需求...
在iOS开发中,单例模式是一种常见的设计模式,它确保一个类只有一个实例,并提供一个全局访问点。Swift3中,有四种主要的实现单例模式的方法。这些方法各有优缺点,适应不同的场景需求。以下是对这四种单例模式的...
单例模式是软件设计模式中的一种经典模式,它在Java编程中被广泛使用。这个模式的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这样做的好处在于可以控制资源的共享,减少内存开销,以及简化对全局配置...
单例模式是一种设计模式,它在软件工程中广泛用于确保类只有一个实例,并提供一个全局访问点。Swift3中,有四种常见的单例实现方式,每种都有其特点和适用场景。下面我们将详细讲解这四种单例模式并提供相应的实例。...
PHP单例模式详解 单例模式的概念 单例模式是指整个应用中某个类只有一个对象实例的设计模式。具体来说,作为对象的创建方式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统全局的提供这个实例。它...
李建忠老师的设计模式-单例模式讲解,示例以C++编程语言呈现。