Java中的锁有哪些?
Java 中有多种类型的锁,用于实现多线程之间的同步和互斥
- synchronized 锁:Java最常用的锁,可用来实现对象级别的同步
- ReentrantLock:JDK提供的可重入锁,提供了比synchronized更强大的功能,如可中断锁、公平锁等
- ReadWriteLock:JDK提供的读写锁,可分类读访问和写访问,可以提高并发性能
- StampedLock:JDK8引入的锁,支持乐观读取、悲观读取和写入操作。提供更高的并发性能
- CountDownLatch:是一种计数器,允许一个或多个线程登台其他线程执行完特定操作后再继续执行
synchronized
CAS
CAS(Compare and Swap)是一种并发控制机制,常用于多线程编程和分布式系统中,用于解决并发修改数据时可能引发的竞态条件问题。
实现
- 比较操作:从内存中读取当前值与期望值进行比较
- 交换操作:如果比较成功(相等),则将新值写入内存中,完成更新操作
- 失败处理:如果比较失败(值不相等),则说明其他线程已经修改了值,CAS操作失败,不执行更新。
在多线程环境下,CAS 可用于实现各种并发算法和数据结构,如无锁队列、计数器、分布式锁等。在分布式系统中,CAS 操作也可以用于实现乐观锁,通过比较版本号等来确保数据的一致性。
需要注意的是,虽然 CAS 可以避免了锁的性能问题,但在高并发的情况下,可能会出现 CAS 自旋等待的情况,导致 CPU 资源浪费。因此,CAS 适用于轻量级的并发控制,但在一些特定场景下可能需要考虑其他的并发控制策略。