Java多线程中的乐观锁与悲观锁解析

使用 GPT-4o-mini 回答Java Q&A Hub

問題:

Java面试题之多线程 什么是乐观锁和悲观锁

答案:

在多线程编程中,乐观锁和悲观锁是两种不同的并发控制策略,用于处理多个线程对共享资源的访问。

悲观锁(Pessimistic Lock)

悲观锁是一种假设会发生冲突的锁策略。在使用悲观锁时,线程在访问共享资源之前会先获取锁,确保在访问期间没有其他线程可以访问该资源。悲观锁通常会导致线程阻塞,直到锁被释放。

特点:

  • 锁定资源:在访问资源之前,线程会先获取锁。
  • 阻塞:如果其他线程已经持有锁,当前线程会被阻塞,直到锁被释放。
  • 适用场景:适用于写操作频繁的场景,或者对数据一致性要求较高的场合。

实现方式: 在Java中,悲观锁可以通过synchronized关键字或ReentrantLock类来实现。

乐观锁(Optimistic Lock)

乐观锁是一种假设不会发生冲突的锁策略。在使用乐观锁时,线程在访问共享资源时不会立即获取锁,而是先进行操作,最后在提交时检查是否有其他线程对资源进行了修改。如果没有修改,则提交成功;如果有修改,则需要重试。

特点:

  • 不锁定资源:在访问资源时不加锁,直接进行操作。
  • 检查冲突:在提交时检查是否有其他线程修改了资源。
  • 适用场景:适用于读操作频繁、写操作较少的场景。

实现方式: 在Java中,乐观锁通常通过版本号(Version)或时间戳(Timestamp)来实现。例如,使用AtomicInteger类或java.util.concurrent包中的其他原子类。

总结

  • 悲观锁:假设会发生冲突,使用锁来保护资源,适合写操作频繁的场景。
  • 乐观锁:假设不会发生冲突,先进行操作再检查,适合读操作频繁的场景。

选择使用乐观锁还是悲观锁,通常取决于具体的应用场景和对性能与一致性的需求。