因此改变代码如下:
|
但这样又产生了一个问题,每次获取实例时方法都是同步的,显然性能很受影响的,所以继续更改代码如下:
先记一下:volatile(网上抄的)
volatile,用更低的代价替代同步
为什么使用volatile比同步代价更低?
同步的代价,主要由其覆盖范围决定,如果可以降低同步的覆盖范围,则可以大幅提升程序性能.
而volatile的覆盖范围仅仅变量级别的。因此它的同步代价很低.
volatile原理是什么?
volatile的语义,其实是告诉处理器,不要将我放入工作内存,请直接在主存操作我.(工作内存详见java内存模型)
因此,当多核或多线程在访问该变量时,都将直接操作主存,这从本质上,做到了变量共享。
volatile的有什么优势?
1、更大的程序吞吐量
2、更少的代码实现多线程
3、程序的伸缩性较好
4、比较好理解,无需太高的学习成本
volatile有什么劣势?
1、容易出问题
2、比较难设计
volatile使用jdk要求1.5版本及1.5以上。
改进后的代码如下(又叫双重加锁):
|
参考自第联网和head first设计模式。