早上大马路就在施工,闹腾的睡不着。
关于单例模式,一开始以为很简单,一直都是这样写的:
public class Singleton{ public static Singleton instance = null; private Singleton(){ } public static Singleton getInstance(){ if(instance == null){ instance = new Singleton(); } return instance; } }
正巧最近在看Java相关的多线程、并发。也有人在网上说了这个问题。上边的这个法子不是线程安全的!
所以改呗。加个synchronized不就行了呗。
public synchronized static Singleton getInstance(){ if(instance == null){ instance = new Singleton(); } return instance; }
这样肯定就行了。不过唯一麻烦的是在大量调用Singleton.getInstance()的时候可能会有性能问题。
再改,在里边加锁:
public static Singleton getInstance(){ if(instance == null){ synchronized(Singleton.class){ if(instance == null){ instance = new Singleton(); } } } return instance; }
把锁加到instance为null的条件中,这样就快多了。然后里边还得再加个判断。这样其他县城再调用的时候instance已经初始化就不用再new了。。。。网上把这个叫做double-checked locking。
还有没有其他的法子?干脆就在声明类的时候直接初始化不就行了!?于是有了个:
public class Singleton{ public static final Singleton INSTANCE = new Singleton(); private Singleton(){ } public static Singleton getInstance(){ return INSTANCE; } }
这样就行了。不过网上说在这个累初始化消耗不大的时候可以这样用。PS:加上了final就是不可变的了。
最后找的麻烦,直接上维基百科(https://en.wikipedia.org/wiki/Singleton_pattern)。发现前边的例子都有,而且还提供了两个更狂燥的例子。
例子1:
public class Singleton{ public static class SingletonHolder(){ private static final Singleton INSTANCE = new Singleton(); } private Singleton(){ } public static Singleton getInstance(){ return SingletonHolder.INSTANCE; } }
貌似这是因为Java虚拟机在这样处理内部类的时候会保证线程安全。而且据称在所有版本的JVM下都可以搞得定。
例子2:
public enum Singleton{ INSTANCE; public void doSomeThing(){ // ... } }
有些简单的过了。。。。。用的居然是Enum!!!然后用的时候直接Singleton.INSTANCE就可以了!!!不过貌似要在JDK5以上才能支持,而且支持的原因很简单。JDK5以后枚举里创建对象是线程安全的。。。。《Effect Java》里就是这样搞的。。。。
相关推荐
简单的单例模式举例Singleton 分为恶汉式 懒汉式
在Java中,有多种实现单例模式的方法,每种都有其特点和适用场景。接下来,我们将深入探讨这些实现方式。 首先,我们来看**懒汉式(Lazy Initialization)**。这种实现方式是在类被首次请求时才创建单例对象,延迟...
Java中的单例模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供全局访问点。在Java编程中,单例模式常用于控制资源的访问,比如数据库连接池、线程池或者日志对象等。本篇文章将深入探讨如何在Java中...
### 单例模式 Singleton Pattern #### 概述 单例模式是一种常见的设计模式,属于创建型模式之一。这种模式的核心在于确保某个类只有一个实例存在,并且提供一个全局访问点来获取该实例。单例模式在Java开发中尤其...
单例模式的特点有三: 单例类只能有一个实例。 单例类必须自己创建自己的唯一实例。 单例类必须给所有其他对象提供这一实例。 Singleton模式包含的角色只有一个,就是Singleton。Singleton拥有一个私有构造函数,...
Java单例模式是一种设计模式,它允许在程序中创建唯一一个类实例,通常用于管理共享资源,例如数据库连接、线程池或者配置对象等。单例模式的核心在于限制类的构造函数,确保类只能被初始化一次,从而实现全局唯一的...
Java单例模式是一种常用的设计模式,它保证一个类只有一个实例,并提供全局访问点。这种模式在需要频繁创建和销毁对象的场景中,或者当对象昂贵时(如数据库连接),能够节省系统资源,提高效率。本篇文章将深入探讨...
在Java或类似编程语言中,单例模式常常被用来管理资源,比如数据库连接、线程池或者配置信息,因为这些资源通常需要全局共享且控制其生命周期。在描述中提到的随机数生成器就是一个典型的单例应用,它确保在整个应用...
### JAVA单例模式的几种实现方法 #### 一、饿汉式单例类 饿汉式单例类是在类初始化时就已经完成了实例化的操作。这种实现方式简单且线程安全,因为实例化过程是在编译期间完成的,不会受到多线程的影响。 **代码...
Java单例模式是一种常见的设计模式,它在软件工程中用于控制类的实例化过程,确保一个类只有一个实例,并提供一个全局访问点。这种模式在系统资源管理、缓存、日志记录等方面应用广泛。下面我们将深入探讨Java单例...
Java中的单例模式主要分为三种实现方式:懒汉式单例、饿汉式单例和登记式单例。 1. 懒汉式单例(Lazy Initialization) 懒汉式单例的特点是在类被加载时不创建实例,而是在首次调用`getInstance()`方法时才进行实例...
在Java中实现单例模式有多种方法: 1. **饿汉式(静态常量)**:在类加载时就完成了初始化,所以没有线程安全问题,但这种实现方式无法实现延迟加载。 ```java public class Singleton { private static final ...
### Java单例模式应用研究 #### 一、单例模式概述 单例模式(Singleton Pattern)作为一种最基本的创建型设计模式,其主要目的是控制一个类的实例化过程,确保在整个应用程序中仅存在一个实例,并且该实例能够被全局...
Java单例模式是一种常用的设计模式,它用于保证一个类只有一个实例,并提供全局访问点。这种模式在系统资源有限或者需要共享昂贵对象时尤其有用,比如数据库连接池、线程池等。下面我们将深入探讨Java单例模式的实现...
在Java编程中,单例模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供一个全局访问点。这种模式在需要频繁创建和销毁对象的场景中尤其有用,因为它可以节省系统资源并确保对象间的协调一致。以下是...
单例模式(Singleton Pattern)是一种常用的软件设计模式,它的核心思想是确保一个类在整个应用程序中只有一个实例存在,并提供一个全局访问点来获取这个实例。这种模式在很多场景下非常有用,比如管理系统资源、...
Java中的单例模式是一种常用的设计模式,用于控制类的实例化过程,确保在整个应用程序中,一个类只有一个实例存在。这种模式常用于系统资源管理,如数据库连接池、缓存管理和线程池等场景。 单例模式的核心在于限制...
Java的单例模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供全局访问点。在Android开发中,单例模式的应用尤其广泛,因为它能够有效管理资源,减少内存开销,提高性能。以下是对单例模式在Android中...
在Java中,单例模式的实现通常有几种方法: 1. **饿汉式(静态常量)**:在类加载时就完成初始化,所以类加载比较慢,但获取对象的速度快,且线程安全。 ```java public class Singleton { private static final ...