博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java 单例模式学习理解
阅读量:7045 次
发布时间:2019-06-28

本文共 1156 字,大约阅读时间需要 3 分钟。

正常的单例模式如下所示:

public class SingleTon {    private volatile static SingleTon sInstance;    private SingleTon() {    }    public static SingleTon getInstance() {        if (sInstance == null) {            synchronized (SingleTon.class) {                if (sInstance == null) {                    sInstance =  new SingleTon();                }            }        }        return sInstance;    }}复制代码

关于这段代码,有些问题和理解:

1、私有化构造函数,保证了其他类调用的时候不能通过这种方式初始化获得对象。2、提供一个公共的静态方法获取实例对象。此时为何要进行两次判空操作呢?a、第一次判空操作是为了避免每次都执行synchronized同步锁的操作,synchronized是很消耗性能的操作,如果第一次不为空,则不用去执行同步锁操作。b、synchronized可以保证每个时刻只有一个线程执行同步代码,准确的说是保证线程间的有序性操作。c、第二次判空则是防止多个类都调用该方法时,多次获取实例对象。如果已经实例化后,则此时不会再实例化对象。3、synchronized方法里的SingleTon.class可以换成SingleTon.this吗?答案是不可以。原因是synchronized同步块括号中的锁定对象是采用的一个无关的Object类实例,而不是采用this,因为getInstance是一个静态方法,在它内部不能使用非静态的或者未实例的类对象4、volatile 关键字首先,sInstance =  new SingleTon();这句话做了哪些事情a、给sInstance实例分配内存。b、初始化SingleTon()成员变量。c、将sInstance对象指向new Singleton()分配的内存空间,所以这个时候sInstance就不为null了。此时问题出现了,如果按照abc顺序执行,则一切正常,但是JVM有指令重排序的优化,所以有可能会按照acb的顺序执行,那这样就出现问题了。volatile就是防止重排序的,这样就能正常获取单例了。复制代码

关于单例的学习笔记,便于以后回顾

转载于:https://juejin.im/post/5b8cf8726fb9a019ea021453

你可能感兴趣的文章
vector.size() vector.capacity size_type vector.reserve()
查看>>
我的友情链接
查看>>
Can't load '/usr/lib/perl5/site_perl/5.8.5/i386-linux-thread-multi/auto/DBD/mysql/mysql.so
查看>>
那些年收藏的Android开源库集合(控件)
查看>>
crontab里shell脚本将top信息写入文件
查看>>
samba实现不同权限进入不同文件夹
查看>>
如何设计让用户成瘾的体验?(三)
查看>>
什么是Ajax
查看>>
Web前端——链接和表格使用规范
查看>>
2.6.18 32位环境 src.rpm包的使用
查看>>
Windows服务创建及安装
查看>>
我的友情链接
查看>>
【教程】Excel控件Spire.XLS 教程:在C#,VB.NET中添加Excel边框
查看>>
我的友情链接
查看>>
python-tag标记工具
查看>>
Python 学习练习之用户登录接口
查看>>
canvas制图
查看>>
【别人推荐】优秀博客、网站资源
查看>>
保税仓库
查看>>
linux帮助相关命令man、info、help
查看>>