Java中的乐观锁主要有两种常见的实现方式:
- CAS(Compare and Swap):这是实现乐观锁的核心算法。CAS操作包含三个参数:内存地址V、旧的预期值A和要修改的新值B。执行CAS操作时,会先比较内存地址V中的值是否等于旧的预期值A,如果相等,就将V中的值替换为新值B,并返回成功;如果不相等,就返回失败,并重新获取V中的最新值。Java中提供了一系列的原子类,如AtomicInteger、AtomicLong、AtomicReference等,它们都使用了CAS操作来实现原子性。
- 版本号控制:每当一个线程要修改数据时,都会先读取当前的版本号或时间戳,并将其保存下来。线程完成修改后,会再次读取当前的版本号或时间戳,如果发现已经变化,则说明有其他线程对数据进行了修改,此时需要回滚并重试。
这两种方式都是在数据被修改前进行检查,如果数据没有被其他线程修改过,则进行修改操作,否则采取回滚或重试的策略,从而避免了数据冲突。乐观锁通常适用于读多写少的场景,因为只有在写操作时才会进行冲突检查,而读操作则不会加锁,因此可以提高并发性能。