java写⼀个线程安全的单例模式Singleton
1.饿汉式单例
指在⽅法调⽤前,实例就已经创建好了
1. package jichu;
2.
3. public class Singleton {
4. private static Singleton instance=new Singleton();
5. private Singleton(){
6.
7. }
8. public static Singleton getInstance(){
9. return instance;
0. }
1. }
注意:要保证系统中不会有⼈意外创建多余的实例,便把构造函数设置为private,instance对象必须是private且是static的,如果不是private那么instance的安全性将⽆法保证,⼀个⼩⼩的意外可能使得instance变为null
存在问题:Singleton实例在什么时候创建是不受控制的,对于静态成员instance,它会在类第⼀次初始化的时候被创建,这个时刻并不⼀定是getInstance⽅法第⼀次被调⽤的时候
2.加⼊synchronized的懒汉式单例
指在调⽤的时候才去创建这个实例,为了防⽌对象被多次创建,使⽤synchronized进⾏⽅法同步
1. package jichu;
2.
3. public class Singleton {
4. private static Singleton instance;
5. private Singleton(){
6.单例模式的几种实现方式
7. }
8. public static synchronized Singleton getInstance(){
9. if(instance==null){
0. instance=new Singleton();
1. }
4. }
优点:充分利⽤了延迟加载,只在真正需要时创建对象
缺点:并发环境下加锁,竞争激烈的场合对性能可能会产⽣⼀定的影响
3.使⽤静态内部类的⽅式
利⽤classloder机制来保证初始化instance时只有⼀个线程,和饿汉式的区别是:饿汉式只要Singleton类被加载,那么instance就会被实例化,⽽这种⽅式是Singleton类被加载了,instance也不⼀定被初始化,只有通过调⽤getInstance()⽅法时才会显式装载SingletonHolder类,从⽽实例化instance,可以做到真正需要的时候创建实例
1. package jichu;
2.
3. public class Singleton {
4.
5. private Singleton(){
6.
7. }
8. // 静态内部类
9. private static class SingletonHolder{
0. private static Singleton instance=new Singleton();
1. }
2. public static Singleton getInstance(){
3. return SingletonHolder.instance;
4. }
5. }
4.双重校验锁,不推荐
1. package jichu;
2.
3. public class Singleton {
4. private volatile static Singleton instance=null;
5.
6. private Singleton(){
7.
0. public static Singleton getInstance(){
1. if(instance==null){
2. synchronized(Singleton.class){
3. if(instance==null){
4. instance=new Singleton();
5. }
6. }
7. }
8. return instance;
9. }
0. }
为什么⽤两个if判断这个对象是否是空?
因为当有多个线程同时创建对象的时候,多个线程有可能都停⽌在第⼀个if判断的地⽅,等待锁的释放,然后多个线程都创建了对象,这样就不是单例模式了,so,使⽤两个if
5.使⽤static代码块
静态代码块中的代码在使⽤类的时候就已经执⾏
1. package jichu;
2.
3. public class Singleton {
4. private static Singleton instance=null;
5.
6. private Singleton(){
7.
8. }
9. static {
0. instance=new Singleton();
1. }
12.
3. public static Singleton getInstance(){
4. return instance;
5. }
6.使⽤枚举数据类型
1. package jichu;
2.
3. public class Singleton {
4. private enum MyEnumSingleton{
5. singletonFactory;
6. private Singleton instance;
7. // 枚举类的构造⽅法在类加载时被实例化
8. private MyEnumSingleton(){
9. instance=new Singleton();
0. }
1. public Singleton getInstance(){
2. return instance;
3. }
4. }
5. public static Singleton getInstance(){
6. return Instance();
7. }
8. }
原⽂地址:m/wmyskxz/p/9021597.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。