先从一道笔试题开始:
9. volatile关键字是否能保证线程安全?() 答案:不能
synchronized和volatile的区别
synchronised是一个方法级别或块级别的访问限制修饰符,也就是可以放在方法前面也可以用在同步块上。它可以确保一个线程获得一个“禁区”的锁。也就是只有这一个线程拥有进入执行synchronized块的钥匙。如果其他的线程在同一时刻也想访问同步块这个“禁区”,那么他们就必须要等待现在在里边的那个线程出来后释放掉锁才可以进去。(这里你可以理解为排队上厕所)所以是保证线程安全的。
volatile是一个变量上的一个访问修饰符。这个是什么意思呢?就是加了这个关键字以后,就会强制让所有的线程都去从主内存(main memory)中得到最新的值而不是去cache中去拿。特别要注意的是,所有的线程可以同时去拿这个volatile变量,也就是没有加锁的意思。所以并不能保证线程安全。
一个使用volatile变量的典型例子就是Date变量。现在假设我们定义一个时间变量。所有的线程都去得到时间,由于是volatile变量,所以每个线程都会从主内存得到最新的时间值。就不会再有那种不同的线程显示的是不同的时间的情况了。所有的线程都显示了正确的时间。
下面的这个图就是告诉你有关主内存和工作内存的一个关系。
以上只是一个简单的对比说明,我们将会在以后慢慢讨论这两个关键字。
本文分享自 ImportSource 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!