synchronized关键字
synchronized作为java的一个关键字,用来保证同一时刻最多只有一个线程执行synchronized修饰的方法/代码块,保证线程安全,解决多线程并发问题。悲观锁
被认定为是悲观锁的原因是并发策略是悲观的,不管是否会产生竞争,任何数据操作都必须要加锁,当然后续的JVM的升级使得synchronized也有了锁升级的过程
作用
- 保证原子性,由于同一时刻只能有一个线程能够执行临界区的代码,使得临界区的代码是一个原子操作
- 保证可见性
cpu在执行代码的时候,为了减少变量访问的时间消耗可能会将代码中访问的变量值缓存到该CPU的缓存区,所以在相应代码再次访问某个变量时,读到的值可能来自于缓存区而不是主存,同样,代码对这些缓存过的变量值的修改也可能只是被写入到缓存区,而没有回写到主存,且每个CPU都有自己的缓存区,因此一个CPU缓存区中的内容对于其他CPU是不可见的
可见性就是一个线程对于共享变量的修改能够及时的被其他线程看到
共享变量是指如果一个变量在多个线程的工作内存中都存在副本,那么这个变量就是这几个线程的共享变量
在java规范中指出:为了获得更快的速度,允许线程保存共享变量的私有拷贝,而且只有在线程进入或者离开同步代码块时才会将私有拷贝与共享内存中的原始值进行比较
可见性的实现方式
先举一个例子,来看一下不使用volatile的时候
1 | public class TestVolatile { |