易失性与联锁对抗锁定
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 假设一个类有一个由多个线程访问的 public int counter 字段。 此 int 仅递增或递减。 要增加此字段,应使用哪种方法,为什么? lock(this.locker) this.counter++; , Interlocked.Increment(ref this.counter); , 将 counter 的访问修饰符更改为 public volatile 。 既然我发现了 volatile ,我一直在删除许多 lock 语句和 Interlocked 的使用。 但是有理由不这样做吗? #1楼 我是第二个Jon Skeet的回答,并希望为想要了解更多关于“volatile”和Interlocked的人们添加以下链接: 原子性,波动性和不变性是不同的,第一部分 - (Eric Lippert的编码中的神话般的冒险) 原子性,波动性和不变性是不同的,第二部分 原子性,波动性和不变性是不同的,第三部分 Sayonara Volatile - (2012年出现的Joe Duffy博客的Wayback Machine快照) #2楼 互锁功能不会锁定。 它们是原子的,这意味着它们可以完成而不会在增量期间进行上下文切换。 所以没有死锁或等待的可能性。 我会说你应该总是喜欢锁定和增量。