黑马程序员技术交流社区
标题:
分享三种单例模式!
[打印本页]
作者:
lfs454766767
时间:
2014-8-19 14:43
标题:
分享三种单例模式!
本帖最后由 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...
}
}
复制代码
作者:
sk0806
时间:
2014-8-19 16:38
赞个兄弟,,咱头像,,,呵呵
作者:
danmo
时间:
2014-8-19 17:54
谢谢分享,受教了
作者:
回头浪子心
时间:
2014-8-19 20:48
额。。貌似。。。。。。。。。
作者:
wyf20106
时间:
2014-8-19 22:22
收下了,谢谢分享
作者:
ximi
时间:
2014-8-20 20:11
不错,继续加油
作者:
lspooooo
时间:
2014-8-21 09:15
谢谢分享,总算知道枚举和单例设计模式的关系了
作者:
何艳梅
时间:
2014-8-24 22:47
谢谢分享
作者:
小洁呵呵
时间:
2014-8-25 08:47
非常不错啊
作者:
viliv715
时间:
2014-8-25 09:10
不错不错 学习了
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2