21xrx.com
2025-03-25 11:54:36 Tuesday
文章检索 我的文章 写文章
Java中的乐观锁实现类及使用案例
2023-06-16 14:24:28 深夜i     14     0
Java 乐观锁 Atomic 版本号 JPA

在Java中,乐观锁是一种并发控制机制,它通过比较读取值和期望值的方式来判断在并发情况下是否需要加锁。相比于悲观锁,乐观锁可以减少锁的使用次数,提高并发性能。那么在Java中,有哪些类实现了乐观锁呢?

1. Atomic包中的类

Java中提供了AtomicBoolean、AtomicInteger、AtomicLong、AtomicReference等多个类实现了乐观锁。以AtomicInteger为例,可以通过compareAndSet方法来实现乐观锁:

AtomicInteger value = new AtomicInteger(0);
int expect = 0;
int update = 1;
while (!value.compareAndSet(expect, update)) {
  // 如果当前值与期望值不相等,说明有其他线程修改过,需要重新读取当前值和期望值
  expect = value.get();
}

2. 基于版本号的乐观锁

基于版本号的乐观锁是指在数据模型中增加一个version字段,每次更新操作时将version加1,读取时将version的值存储在临时变量中,更新时比较当前版本号与临时变量中的版本号是否相等,如果相等则更新,否则提示用户数据已被修改。

public class Account {
  private int id;
  private String name;
  private int balance;
  private int version;
  public void updateBalance(int amount) {
    balance += amount;
    version++;
  }
  public int getId()
    return id;
  
  public void setId(int id)
    this.id = id;
  
  public String getName()
    return name;
  
  public void setName(String name)
    this.name = name;
  
  public int getBalance()
    return balance;
  
  public void setBalance(int balance)
    this.balance = balance;
  
  public int getVersion()
    return version;
  
  public void setVersion(int version)
    this.version = version;
  
}

3. JPA中的@Version注解

在JPA中,可使用@Version注解来实现乐观锁。当通过@Version注解标注的字段进行更新操作时,JPA会自动获取当前记录的版本号,并在更新操作中判断该版本号是否已被修改。

@Entity
public class Person
  @Id
  private Long id;
  private String name;
  @Version
  private Integer version;

  
  

评论区