java乐观锁怎么加
时间: 2023-12-06 22:14:20 浏览: 52
在Java中,乐观锁通常使用版本号(Version)或时间戳(Timestamp)来实现。具体步骤如下:
1. 在数据表中增加一个版本号(Version)或时间戳(Timestamp)字段。
2. 当读取数据时,将版本号或时间戳一并读取出来。
3. 在更新数据时,先比较当前数据的版本号或时间戳与读取时的值是否一致,如果一致则更新数据,并将版本号或时间戳加1(或更新为当前时间);否则说明数据已被其他线程修改,更新失败。
4. 如果更新失败,则可以选择重试或放弃更新。
下面是一个使用版本号实现乐观锁的示例代码:
```java
public class OptimisticLockDemo {
public static void main(String[] args) {
Account account = new Account(10000, 1);
new Thread(() -> {
account.withdraw(6000);
}).start();
new Thread(() -> {
account.withdraw(6000);
}).start();
}
}
class Account {
private int balance;
private int version;
public Account(int balance, int version) {
this.balance = balance;
this.version = version;
}
public synchronized void withdraw(int amount) {
if (balance >= amount) {
balance -= amount;
System.out.println("Withdraw " + amount + " successfully, balance is " + balance);
version++;
} else {
System.out.println("Withdraw " + amount + " failed, balance is " + balance);
}
}
}
```
在上面的示例代码中,Account类表示一个账户,其中balance表示账户余额,version表示账户版本号。withdraw方法表示取款操作,采用synchronized关键字实现同步,当账户余额不足时,取款失败;否则更新账户余额并增加版本号。如果两个线程同时尝试取款,其中一个线程会因版本号不匹配而更新失败,从而导致取款操作失败。
阅读全文