本帖最后由 lfs454766767 于 2014-8-20 08:16 编辑
- 1. 双重检查加锁机制,指的是:并不是每次进入getInstance()都需要同步,而是先不同步,进入方法过后,先检查实例是否存在,如果不存在才进入同步块,这是第一重检查。进入同步块后,再次检查实例是否存在,如不不存在,就在同步的情况下创建一个实例,这是第二重检查。 这样以来,只需用同步一次了(指检查阶段),从而减少了多次在同步情况下进行判断所浪费的时间
- 双重检查加锁机制的实现会使用一个关键字volatile,它的意思是:被volatile修饰的变量的值,将不会被本地线程缓存,所有对该变量的读写都是直接操作共享内存,从而确保多个线程能够正确处理变量。
- public class Singleton {
- private volatile static Singleton instance = null;//被volatile修饰的变量
- private Singleton() {}//私有构造方法
- public static Singleton getInstance() {
- if (instance == null) {
- //同步块,线程安全的创建实例
- synchronized(Singleton.class){
- if(instance == null){
- instance = new Singleton();
- }
- }
- }
- return instance;
- }
- 2. 类级内部类相当于其外部类的static成分,它的对象与外部类对象间不存在依赖关系,因此可以直接创建。而对象级内部类的实例,是绑定在外部对象实例中的,属聚合关系。 类级内部类中,可以定义静态的方法,在静态方法中只能够引用外部类中的静态成员方法或者成员变量(因为是static的类,需要引用外部类标为static的成员变量或方法 )。 类级内部类相当于其外部类的成员(这个很容易理解,依附于谁,就是谁的一部分),只有在第一次使用的时候才会被装载(相当于静态可共享的成员变量)。
- 类级内部类与线程同步锁的关系:在Java中,解决线程并发问题主要通过使用synchronized来加互斥锁进行同步控制。但是在某些情况下,jvm已经隐含的为你执行了同步
- public class Singleton {
- /*类级内部类的实例与外部类的实例没有绑定关系,而且只有在被调用的时候才会装载,从而实现了延迟加载*/
- private static class SingletonHolder{
- private static Singleton instance = new Singleton();
- }
- private Singleton() {}//私有构造方法
- public static Singleton getInstance() {
- return SingletonHolder.instance;
- }
- 3. (1)Java的枚举类型实质上是功能齐全的类,因此可以有自己的属性和方法;(2)Java枚举类型的基本思想:通过公有的静态final域为每个枚举常量导出实例的类;(3)从某个角度讲,枚举是单例的泛化,本质上是单元素的枚举。
- <P>public enum Singleton{
- uniqueInstance;/*定义一个枚举元素,它就代表了Singleton的一个实例*/
- /*实例方法,单例可以有自己的操作*/
- public void singletonOperation(){
- //Todo...
- }
- }
复制代码 |