原子性与易变性

了解原子性是很有用的,并且要知道原子性与其他高级技术一道,在java.util.concurrent类库中已经实现了某些更加巧妙的构件。但是要坚决抵挡住完全依赖自己的能力去进行处理的这种欲望。

原子性可以应用于除long和double之外的所有基本类型之上的“简单操作”。对于读取和写入除long和double之外的基本类型变量这样的操作,可以保证它们会被当作不可分(原子)的操作来操作内存。但是JVM可以将64位(long和double变量)的读取和写入当作两个分离的32位操作来执行,这就产生了一个在读取和写入操作中间发生上下文切换,从而导致不同的任务可以看到不正确结果的可能性(这有时被称为字撕裂,因为你可能会看到部分被修改过的数值)。但是,当你定义long或double变量时,如果使用volatile关键字,就会获得原子性,不同的JVM可以任意地提供更强的保证,但是你不应该依赖于平台相关特性。

因此,原子操作可由线程机制来保证其不可中断,专家级的程序员可以利用这一点来编写无锁代码,这些代码不需要被同步,但是即便是这样,它也是一种过于简化的机制。有时,甚至看起来应该是安全的原子操作,实际上也可能不安全。尝试着移除同步通常是一种表示不成熟化的信号,并且将会招致大量的麻烦,而你却可能没有收获多少好处,甚至压根没有任何好处。

volatile关键字还确保了应用中的可视性,如果将一个域声明为volatile的,那么只要对这个域产生了写操作,那么所有的读操作就都可以看到这个修改。即便使用了本地缓存,volatile域会立即被写入到主存中,而读取操作就发生在主存中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值