呱啦几句:
对于那么久才更新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!