登录
专栏 0 关注 7 篇文章
Java单例
Java单例
micro_cloud_fly
关注专栏
推荐文章
举报
4 年前  /  micro_cloud_fly

Java设计模式(6)

本文介绍Java设计模式第六种这种模式是在第五种模式的基础之上演变而来,常被成为DCL(double check lock)单例模式,同时,在静态变量上面加上了volatile关键字(一定要加),这个关键字一般来说有两个作用: 内存可见和禁止指令重排序。首先,我们来假设不加这个关键字会出现什么问题。假设两个线程同时运行到第一个if (instance == null)这段代码,此时假设线程1抢到了锁,那么它可以进行下面的同步代码块,在同步代码块里面,它又检查了一次实例是否为null,那么此时in

0 赞 0 评论
收藏
4 年前  /  micro_cloud_fly

Java设计模式(5)

本文介绍Java设计模式的第五种这种方法是基于第四种设计模式演变而来,只不过synchronized锁定的是代码块,而不是一个方法,从锁定的对象范围来说是小一些。它企图通过减少锁定的范围来进行效率的提升,但是此方法不能保证只new了一个实例。举个例子来说,例如,线程1执行到了if (instance == null) 这段代码,此时进行了线程切换,此时线程2也执行了段代码,判断instance确实为null,于是初始化了instance,此时,再进行线程切换,线程1继续向下执行,它也实例化了一个

0 赞 0 评论
收藏
4 年前  /  micro_cloud_fly

Java单例模式(4)

本文介绍Java单例模式第四种这种策略的模式是使用Java的关键字synchronized修饰了getInstance()方法,用的是同步方法。这在操作系统中被认为是管程。管程的实质不是由操作系统进行了特殊操作,而是由编译器进行了同步代码块的封装,类似于C语言中的pthread_mutex_lock和pthread_mutex_unlock,而在操作系统层面,实际上就是一对原子操作,也被成为原语,意思就是对于共享资源的加锁。只有使用完了这个资源才会释放这个资源,由其他进程使用。synchroni

0 赞 0 评论
收藏
4 年前  /  micro_cloud_fly

Java单例模式(3)

本文介绍Java单例模式的第三种这种策略和前两种的区别是,没有使用静态代码块来进行初始化,而是在调用静态方法获取实例的时候来检查实例是否已经被初始化了,如果发现为null,再进行初始化。这应该是一个非常好的方法,因为我们只有在进行需要的时候才把它加载到内存里面。代码部分package singleton;public class Student03 { public static Student03 instance; private Student03(){ } pub

0 赞 0 评论
收藏
4 年前  /  micro_cloud_fly

Java单例模式(2)

本文介绍Java单例模式的第二种这种模式的策略和第一种几乎一样,都是定义了一个静态变量,只不过定义的时候没有初始化,而是在静态代码块中进行了初始化,同样,类在jvm加载到内存的时候,执行了静态代码块,因此在进行获取静态变量之前,这个实例也是一直存在的代码部分package singleton;/** * 和第一种差不多 */public class Student02 { public static final Student02 instance; static {

0 赞 0 评论
收藏
4 年前  /  micro_cloud_fly

Java单例模式(1)

本文介绍单例模式的第一种策略这是最为易于理解和使用的单例模式。它的策略是,在类的内部定义一个静态的变量,并且在定义的时候就已经完成了初始化,这是因为jvm保证了一个类只会被加载到内存一次。这个变量的初始化的时机是在类被加载的时候,静态变量也被分配内存,并且完成了初始化。同时,它的构造方法被定义为私有方法,因此获取实例只能通过类调用静态方法public static Student01 getInstance(),来返回已经初始化的实例。优点使用简单,编码方便易于理解,即使是刚入门的Java程序员

0 赞 0 评论
收藏