单例模式中双重检测锁(java)

呱啦几句:

对于那么久才更新csdn对自己说声抱歉,确实,坚持确实是一件非常非常困难的事情,对于最近又想开始写博客当然是因为有感而发!!!
也是开学的原因吧,开始有了一点点自己能够支配的时间了,这个学期我这个专业开始大规模学习专业知识啦!!!有点开心,毕竟不要再学类似大学物理这样毫无相干的学科了,哈哈哈~~~

正题

对于这个学期学习了操作系统,学习了下原子性这个概念,让我对java多线程的认识更加深刻!!!
对于java中单例模式中的双重检查锁而言

代码先示例如下:~~~

//这里的volatile 主要是为了防止指令重排
	static volatile SingleClass singleClass;
    public static SingleClass getSingleClass() {
        if(singleClass==null){    //这里判断是为了不让线程卡在synchronized这里,而是直接返回singleClass【效率!!】
            synchronized(SingleClass.class){
            因为高并发多线程的情况下synchronized会升级变成重量级的锁,这样来的其他线程会因此进入阻塞队列中 【cpu状态频繁发生变化 【内核态到用户态】】
                if(singleClass==null){
                    singleClass = new SingleClass();         //非原子性操作,且存在CPU指令重排
                    System.out.println(singleClass+"---------->"+Thread.currentThread().getName());
                }
            }
        }
        return singleClass;
    }

对于synchronized这个关键字,读者可以认为它是一把锁,即里面的代码具有原子性,所谓原子性就是指:该指令要么成功要么失败,即在多线程下,一旦有一个进程进去了synchronized内部的代码中时,里面代码必定全部执行完整!!!即其他线程也只能乖乖的在外面等待【进入阻塞队列】,这里其实还有一个锁升级的过程,在jdk1.6之前synchronized这个关键字还是一个重量级锁(内部是借助OS的切换cpu状态来实现的,这种状态的切换比较耗时,需要保护线程运行现场等操作),JDK1.6之后,对synchronized进行了优化,引入了偏向锁和轻量级锁。

解释:
synchronized关键字的特点是:当内部代码全部执行完全后,必定释放锁!!
之后其他线程也会仅有一条线程进入synchronized内部中去执行相应的代码,因为synchronized中代码具有原子性!!!,中间代码不会因为线程时间片的结束而中断!!

这里就可以解释为什么内层需要加个synchronizd关键字了吧,外部的就是因为效率问题了,当一个线程进去以后,必定会生成一个单例对象,那么其他线程也没必要在synchronized上面等待了,直接返回singleClass即可!!!

以上就是全部内容啦!!持续更新中~~~ fight!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

践行~渐远

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值