JAVA之单例模式

单例模式确保摸个类只有一个实例 ,并且自行实例化并向整个系统提供这个实例。

单例模式的特点:

  • 单例类只能有一个实例。
  • 单例类必须自己创建自己的唯一实例。
  • 单例类必须给所有其他对象提供这一实例。

单例分为饿汉式 和懒汉式:

饿汉式: 是一个形象的称谓,既然饿,那么就急着 创建类的实例 ,典型的以 空间换时间,在类的初始化时就创建该类的实例。

懒汉式: 既然懒,那么就不急着创建,等到 要用的时候再将 实例创建出来。

public class HungrySingleton {
    private static HungrySingleton instance = new HungrySingleton();

    /**
     * 私有默认构造子
     */
    private HungrySingleton() {
    }

    /**
     * 静态工厂方法
     */
    public static HungrySingleton getInstance() {
        return instance;
    }
}

在懒汉式的使用时,为了避免线程安全问题,我们一般会 加上一个锁。加锁会降低程序的运行效率,为了解决这个问题。我们一般选择使用双层判断来解决。进入的时候判断是否存在类的实例,不存在才加锁。

public class LazySingleton {
    private volatile static LazySingleton instance = null;

    private LazySingleton() {
    }

    public static LazySingleton getInstance() {
        // 先检查实例是否存在,如果不存在才进入下面的同步块
        if (instance == null) {
            // 同步块,线程安全的创建实例
            synchronized (LazySingleton.class) {
                // 再次检查实例是否存在,如果不存在才真正的创建实例
                if (instance == null) {
                    instance = new LazySingleton();
                }
            }
        }
        return instance;
    }
}

另外两种实现单例的方式: 详见:http://www.cnblogs.com/java-my-life/archive/2012/03/31/2425631.html

/**类级内部类的方式*/
public class Singleton {

    private Singleton(){}
    /**
     *    类级的内部类,也就是静态的成员式内部类,该内部类的实例与外部类的实例
      *    没有绑定关系,而且只有被调用到时才会装载,从而实现了延迟加载。
      */
    private static class SingletonHolder{
        /**
         * 静态初始化器,由JVM来保证线程安全
           */
        private static Singleton instance = new Singleton();
    }

    public static Singleton getInstance(){
        return SingletonHolder.instance;
    }
}
/**枚举方式*/
public enum Singleton {
    /**
     * 定义一个枚举的元素,它就代表了Singleton的一个实例。
      */

    uniqueInstance;

    /**
     * 单例可以有自己的操作
      */
    public void singletonOperation(){
        //功能处理
    }
}
时间: 2024-08-09 19:51:55

JAVA之单例模式的相关文章

java 实现单例模式

public class Singleton { private static Singleton intance; private Singleton() {} public static Singleton getInstance() { /* * 一开始多线程进来,遇到锁,一个线程进去,是为空,new对象: 后续线程进入,不为空,不操作:最后直接返回 * 对象不为空,再有多个线程进入该函数,不为空,不执行加锁操作,直接返回 */ if (intance == null) { synchro

JAVA实现单例模式的四种方法和一些特点

JAVA实现单例模式的四种方法和一些特点,需要的朋友可以参考一下 一.饿汉式单例类 复制代码 代码如下: public class Singleton  {      private Singleton(){ } private static Singleton instance = new Singleton(); private static Singleton getInstance(){          return instance;      }  } 特点:饿汉式提前实例化,没有

Java设计模式の单例模式

-------------------------------------------------- 目录 1.定义 2.常见的集中单例实现 a.饿汉式,线程安全 但效率比较低 b.单例模式的实现:饱汉式,非线程安全 c.饱汉式,线程安全简单实现 d.线程安全 并且效率高  单例模式最优方案 3.总结 a.使用枚举的单例模式 b.使用枚举,static处调用,初始化一次 -------------------------------------------------- 1.定义 确保一个类只有

Java 设计模式 单例模式(Singleton) [ 转载 ]

Java 设计模式 单例模式(Singleton) [ 转载 ] 转载请注明出处:http://cantellow.iteye.com/blog/838473 前言 懒汉:调用时才创建对象 饿汉:类初始化时就创建对象 第一种(懒汉,线程不安全): 1 public class Singleton { 2 private static Singleton instance; 3 private Singleton (){} 4 5 public static Singleton getInstan

java的单例模式,为什么需要volatile

目前看了java并发的书,记录一下.对于java的单例模式,正确的代码应该为: public class TestInstance { private volatile static TestInstance instance; public static TestInstance getInstance() { //1 if (instance == null) { //2 synchronized (TestInstance.class) {//3 if (instance == null)

Java懒汉式单例模式详解

单例模式最常见的有两种,饿汉式和懒汉式两种.本文先简单说一下懒汉式单例,再着重叙述饿汉式单例,饿汉式单例是本文的叙述重点. 懒汉式的优点是:写起来比较简单,而且不存在多线程同步问题,避免了synchronized所造成的性能问题:缺点是:初始化类的时候就需要构造实例,(即便你还没有用到这个实例),因此在某些特定条件下会耗费内存.懒汉式的写法如下: 1 /** 2 * 懒汉式单例 3 * @author James Chong 4 * 5 */ 6 public class SingleTon {

java——多线程——单例模式的static方法和非static方法是否是线程安全的?

单例模式的static方法和非static方法是否是线程安全的? 答案是:单例模式的static方法和非static方法是否是线程安全的,与单例模式无关.也就说,如果static方法或者非static方法不是线程安全的,那么不会因为这个类使用了单例模式,而变的安全. 闲话休说,看代码: import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class TestSingl

Java实现单例模式总结

单例模式(Singleton):是一种常用的设计模式.在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在. 1.懒汉式 线程不安全,当有多个线程并行调用 getInstance() 的时候,就会创建多个实例. public class Singleton { private static Singleton instance; private Singleton (){} public static Singleton getInstance() { if (instance

Java:单例模式的七种写法

转载出处:http://cantellow.javaeye.com/blog/838473 第一种(懒汉,线程不安全): 1 public class Singleton {   2     private static Singleton instance;   3     private Singleton (){}    4     public static Singleton getInstance() {   5     if (instance == null) {   6    

Java之单例模式(Singleton)

摘要: 1.Singleton模式作用:保证在Java应用程序中,一个Class只有一个实例存在 2.Singleton的第一种形式:饿汉式单例模式 (1) 构造函数私有 (2)有一个static 的private的该类的变量 (3)通过一个public getInstance的方法获取对它的引用 代码如下: 1 package com.ggzhang.Test; 2 3 public class Singleton { 4 5 private Singleton() { 6 7 } 8 9 p