Java 单例

最近在网上看到一篇关于 Java 单例的创建问题,虽然是一个 Java 程序员,但是到现在还没有真正的深入了解到 Java 的原理和机制。所以每每看到这样能够“真正”接触 Java 的机会内心总是充满了欣喜。记录下,以后备用。

懒汉模式

public class Singlton{
    private static Singleton instance;

    private Singlton(){}

    public static Singlton getInstance(){
        if(instacne == null)
            instance = new Singlton();
        return instance;
    }
} 

教科书式的写法,但是无法适用于多线程的状态下。

饿汉模式

public class Singleton{
    private static Singletion instance = new Singleton();

    private Singleton(){}

    public static Singleton getInstance(){
        return instance;
    }
}

饿汉模式可以有效的避免多线程的同步问题,不过使用 static 会多多少少牺牲点性能。

静态内部类

public class Singleton{
    private static class SingltonHolder{
        private static final Singleton INSTANCE = new Singlton();
    }

    private Singleton(){}

    public static final Singleton getInstance(){
        return SingletonHolder.INSTANCE;
    }
}

使用静态内部类的方式,利用 ClassLoder 的机制保证了初始化的时候只有一个线程,并且兼顾了性能——Singleton 类被装载的时候,getInstance 并不会立马初始化,只有调用的时候才会被初始化。

枚举

public enum Singleton{
    INSTANCE;

    public void method(){
        //do something
    }
}

这种方式 Effective Java 中推荐的方式,很厉害的一种写法。唯一的缺点就是无法继承了吧。

小结

虽然只是创造一个单例,但是其中需要考虑的东西真的有很多。不得不感叹那些编程高手,能够将心思缜密,利用语言的各种特性去编程创造。对于创建单例模式还是比较推荐使用静态内部类的方式创建,不失性能的同时又兼顾安全。但是其实我更加喜欢枚举的方式。

时间: 2024-12-25 13:37:51

Java 单例的相关文章

java单例类/

java单例类  一个类只能创建一个实例,那么这个类就是一个单例类 可以重写toString方法 输出想要输出的内容 可以重写equcal来比较想要比较的内容是否相等 对于final修饰的成员变量 一但有了初始值,就不能被重新赋值 static修饰的成员变量可以在静态代码块中 或申明该成员时指定初始值 实例成员可以在非静态代码块中,申明属性,或构造器中指定初始值 final修饰的变量必须要显示初始化 final修饰引用变量不能被重新赋值但是可以改变引用对象的内容分(只要地址值不变) final修

java单例-积木系列

一步步知识点归纳吧,把以前似懂非懂,了解表面,知道点不知道面的知识归一下档. 懒汉式单例: 私有化构造函数,阻止外界实例话对象,调用getInstance静态方法,判断是否已经实例化. 为什么是懒汉,因为它是属于延迟加载这个实例的,也就是说不用到的时候,不实例化对象的. public class Singleton { private static Singleton instance; private Singleton (){} public static Singleton getInst

Java单例的实现

1.声明实例变量(静态) 2.私有化构造函数 3.创建获取实例的方法 public class Singleton{ //创建实例变量 private static Singleton singleton; //私有化构造函数 private Singleton(){ } //创建获取实例的方法 public static Singleton getInstance(){ if(singleton==null){ singleton=new Singleton(); } return singl

Java单例设计模式的实现

1. 单例设计模式的定义 单例设计模式确保类只有一个实例对象,类本身负责创建自己的对象并向整个系统提供这个实例.在访问这个对象的时候,访问者可以直接获取到这个唯一对象而不必由访问者进行实例化. 单例设计模式保证了全局对象的唯一性,在许多场景中都有应用.例如Windows中多个进程或线程同时操作一个文件的时候,所有的进程或线程对于同一个文件的处理必须通过唯一的实例来进行. 2. java单例设计模式的几种实现方式 单例设计的最大特点是类的构造函数是私有的,确保了只能由类本身创建对象,而访问者无法进

Java——单例设计模式

设计模式:解决某一类问题最行之有效的方法.Java中23种设计模式:单例设计模式:解决一个类在内存中只存在一个对象. 想要保证对象唯一.1,为了避免其他程序过多建立该类对象.先禁止其他程序建立该类对象2,还为了让其他程序可以访问到该类对象,只好在本类中,自定义一个对象.3,为了方便其他程序对自定义对象的访问,可以对外提供一些访问方式 这三部怎么用代码体现呢?1,将构造函数私有化.2,在类中创建一个本类对象.3,提供一个方法可以获取到该类对象. 对于事物该怎么描述,还怎么描述.当需要将该事物的对象

Java 单例总结

1:懒汉式,不保证线程安全 package com.yan.singleton; public class LazySingleton { private static final LazySingleton instance = null; private LazySingleton(){} public static LazySingleton getLazySingleton(){ if(null==instance){ return new LazySingleton(); } retu

Java: 单例设计模式

设计模式: * 设计模式:解决某一类问题最行之有效的方法:* Java有23中设计模式* 单例设计模式:解决一个类在内存只存在一个对象:* * 想要保证对象唯一* 1.为了避免其他程序过多建立该类对象.先控制禁止其他程序建立该类对象* 2.还为了让其他程序可以访问到该类对象,只好在本类中自定义一个对象* 3.为了方便其他程序对自定义对象的访问,可以对外提供一些访问方式* * 这三部如何用代码体现呢?* 1. 将构造函数私有化* 2. 在类中建立一个本类对象* 3. 提供一个方法可以获取到该对象

从一个简单的Java单例示例谈谈并发

一个简单的单例示例 单例模式可能是大家经常接触和使用的一个设计模式,你可能会这么写 public class UnsafeLazyInitiallization { private static UnsafeLazyInitiallization instance; private UnsafeLazyInitiallization() { } public static UnsafeLazyInitiallization getInstance(){ if(instance==null){ /

从一个简单的Java单例示例谈谈并发 JMM JUC

原文: http://www.open-open.com/lib/view/open1462871898428.html 一个简单的单例示例 单例模式可能是大家经常接触和使用的一个设计模式,你可能会这么写 public class UnsafeLazyInitiallization { private static UnsafeLazyInitiallization instance; private UnsafeLazyInitiallization() { } public static U