synchronized关键字和volatile关键字

synchronized 可以实现操作得到原子性,其本质是通过该关键字所包括的临界区(Critical Section)的排他性保证在任何一个时刻只有一个形成能够执行临界区中的代码。

原子操作如:对int型变量count执行count++操作就不是原子操作。count++可以分解为3个操作:1读取变量count的当前值,2count的当前值和1做加法运算,3将count值加1后的值赋给count变量,在多线程环境下,上面的例子如果没有对相应的代码同步(Synchronization)处理,则可能出现在执行第2个操作的时候count的值已经被其他线程修改了。

    synchronized 可以保证内存的可见性,

        cpu在执行代码的时候为了减少变量访问的时间消耗可能将代码中访问的变量的值缓存到该cpu缓存区(如L Cache,L2 Cache)中。因此相应代码再次访问某个变量时,相应的值可能是从CPU缓存区而不是主内存中读取的。同样的,代码对这些被缓存过的变量的值的修改也可能是被写入cpu缓存区,而没有被写回主内存。由于每个cpu都有自己的缓存区,因此一个cpu缓存区中的内容对于其他cpu而言是不可见的。这就导致了在其他cpu运行的其他线程可能无法看到该线程对某个变量值所做的更改。这就是内存可见性。

   synchronized  保证了一个线程执行临界区中的代码时所修改的变量值对于稍后执行该临界区中的代码的线程来说是可见的。


volatile关键字 可保证内存可见性即一个线程对一个采用volatile关键字修饰的变量的值的更改对于其他访问该变量的线程而言总是可见的。也就是说,其他线程不会读到一个“过期”的线程。volatile实现内存可见性的核心机制是当一个线程修改了一个volatile 修饰的变量的值时,该值会被写入主内存(RAM)而不仅仅是当前线程所在的cpu的缓存,而其他cpud的缓存区存储的该变量的值也会因此而失效 从而更新为主内存中的该变量的值。还禁止了指令重排序。

     volatile并不能真正的保证线程安全,它只能确保一个线程修改了数据后,其他线程能够看到这个改动,但当两个线程同时修改某一个数据时,却依然会产生冲突。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值