一个Java 5中最好的补充是对原子操作的支持类,如AtomicInteger,AtomicLong等。这些类帮助你减少复杂的(不必要的)多线程代码,实际上只是完成一些基本操作,如增加或减少多个线程之间的共享的值。这些类在内部依赖于一个名为CAS(Compare and Swap)的算法。在这篇文章中,我将详细讨论这个概念。
乐观悲观锁
传统的锁机制,例如在Java中使用的synchronized关键字,是多线程的悲观锁技术。它要求您首先保证没有其他线程将在某些操作之间进行干扰(即锁定对象)。
这就像是说:“请先把门关上,否则会有其他的骗子进来整理你的东西”。
虽然上面的方法是安全的,它确实有效,但它在性能上对应用程序造成了严重的影响。原因很简单,等待线程不能做任何事情,除非它们也有机会执行被保护的操作。
实际上存在一种更有效性能更好的方式,在本质上是乐观的。在这种方法中,您继续进行更新,希望您能在不受干扰的情况下完成。这种方法依赖于碰撞检测,来确定是否更新时被其他方面的干扰,在这种情况下,操作失败可以重试(或不)。
乐观的方法就像一句老话:“获得原谅比获得许可更容易”,在这里“更容易”意味着“更有效”。
Compare and Swap是这种乐观方法的一个很好例子,我们将在下面讨论。
Compare and Swap算法
该算法将某个内存位置的内容与给定值进行比较(compare),只有当它们相同