`
mncc
  • 浏览: 54057 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java单例模式Singleton

    博客分类:
  • java
 
阅读更多

早上大马路就在施工,闹腾的睡不着。

关于单例模式,一开始以为很简单,一直都是这样写的:

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》里就是这样搞的。。。。

分享到:
评论

相关推荐

    Java 单例模式Singleton

    简单的单例模式举例Singleton 分为恶汉式 懒汉式

    java单例模式实例

    在Java中,有多种实现单例模式的方法,每种都有其特点和适用场景。接下来,我们将深入探讨这些实现方式。 首先,我们来看**懒汉式(Lazy Initialization)**。这种实现方式是在类被首次请求时才创建单例对象,延迟...

    Java 单例模式 工具类

    Java中的单例模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供全局访问点。在Java编程中,单例模式常用于控制资源的访问,比如数据库连接池、线程池或者日志对象等。本篇文章将深入探讨如何在Java中...

    单例模式 Singleton Pattern

    ### 单例模式 Singleton Pattern #### 概述 单例模式是一种常见的设计模式,属于创建型模式之一。这种模式的核心在于确保某个类只有一个实例存在,并且提供一个全局访问点来获取该实例。单例模式在Java开发中尤其...

    单例模式Singleton(java源码)

    单例模式的特点有三: 单例类只能有一个实例。 单例类必须自己创建自己的唯一实例。 单例类必须给所有其他对象提供这一实例。 Singleton模式包含的角色只有一个,就是Singleton。Singleton拥有一个私有构造函数,...

    Java单例模式深入理解

    Java单例模式是一种设计模式,它允许在程序中创建唯一一个类实例,通常用于管理共享资源,例如数据库连接、线程池或者配置对象等。单例模式的核心在于限制类的构造函数,确保类只能被初始化一次,从而实现全局唯一的...

    Java单例模式设计

    Java单例模式是一种常用的设计模式,它保证一个类只有一个实例,并提供全局访问点。这种模式在需要频繁创建和销毁对象的场景中,或者当对象昂贵时(如数据库连接),能够节省系统资源,提高效率。本篇文章将深入探讨...

    单例模式(singleton)

    在Java或类似编程语言中,单例模式常常被用来管理资源,比如数据库连接、线程池或者配置信息,因为这些资源通常需要全局共享且控制其生命周期。在描述中提到的随机数生成器就是一个典型的单例应用,它确保在整个应用...

    JAVA单例模式的几种实现方法

    ### JAVA单例模式的几种实现方法 #### 一、饿汉式单例类 饿汉式单例类是在类初始化时就已经完成了实例化的操作。这种实现方式简单且线程安全,因为实例化过程是在编译期间完成的,不会受到多线程的影响。 **代码...

    java单例模式的例子

    Java单例模式是一种常见的设计模式,它在软件工程中用于控制类的实例化过程,确保一个类只有一个实例,并提供一个全局访问点。这种模式在系统资源管理、缓存、日志记录等方面应用广泛。下面我们将深入探讨Java单例...

    java设计模式之单例模式.zip

    在Java中实现单例模式有多种方法: 1. **饿汉式(静态常量)**:在类加载时就完成了初始化,所以没有线程安全问题,但这种实现方式无法实现延迟加载。 ```java public class Singleton { private static final ...

    Java单例模式应用研究.pdf

    ### Java单例模式应用研究 #### 一、单例模式概述 单例模式(Singleton Pattern)作为一种最基本的创建型设计模式,其主要目的是控制一个类的实例化过程,确保在整个应用程序中仅存在一个实例,并且该实例能够被全局...

    java单例模式代码实例

    Java单例模式是一种常用的设计模式,它用于保证一个类只有一个实例,并提供全局访问点。这种模式在系统资源有限或者需要共享昂贵对象时尤其有用,比如数据库连接池、线程池等。下面我们将深入探讨Java单例模式的实现...

    Java实现多种单例模式

    在Java编程中,单例模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供一个全局访问点。这种模式在需要频繁创建和销毁对象的场景中尤其有用,因为它可以节省系统资源并确保对象间的协调一致。以下是...

    单例模式Singleton

    单例模式(Singleton Pattern)是一种常用的软件设计模式,它的核心思想是确保一个类在整个应用程序中只有一个实例存在,并提供一个全局访问点来获取这个实例。这种模式在很多场景下非常有用,比如管理系统资源、...

    java单例模式在android中的应用

    Java的单例模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供全局访问点。在Android开发中,单例模式的应用尤其广泛,因为它能够有效管理资源,减少内存开销,提高性能。以下是对单例模式在Android中...

    Java单例模式与工厂模式简单示例代码

    在Java中,单例模式的实现通常有几种方法: 1. **饿汉式(静态常量)**:在类加载时就完成初始化,所以类加载比较慢,但获取对象的速度快,且线程安全。 ```java public class Singleton { private static final ...

Global site tag (gtag.js) - Google Analytics