知足常乐 俭以养德
最好的java5新特性之一就是在类中引入原子操作,例如AtomicInteger
,AtomicLong
等等。针对一些基本操作,这些类帮你简化了多线程代码的复杂性,例如对多线程共享的数据进行增加和减少操作。这些类在内部依赖一个名叫CAS(compare and swap)的算法。在这篇文章中,我将深入的讨论这个概念。
对于传统的锁机制,例如在java中使用synchronized
,它是一种悲观的锁或多线程技术。它首先就要保证没有其他线程干扰特定的操作(例如:给一个对象加锁)然后只允许你(译者注:当前线程)访问其实例或方法。
就像说“先把门关上,否则其他的骗子会乱动你的东西”
虽然上述方法安全有效,但是在性能方面却挖了个大坑。原因就是等待线程除了获得机会去运行受保护的操作外什么也干不了。
有一种更有效的方法,它天生乐观.在该方法里,你处理一个更新操作,并希望能不受干扰地完成它。该方法依靠冲突检测来决定是否有来自其他部分的干扰,当更新失败时能够重试(与否)。
乐观方法正应了那句老话:获得原谅容易,获得许可难。在这里“容易”意味着“更有效”
译者注:作者采用类比,将乐观锁比作原谅,因为乐观锁就是假设当前没有其他线程的干扰。然后还是不太理解这句老话跟本文主旨的联系