private final ReentrantLock lock = new ReentrantLock();
private double balance;
public void deposit(double amount) {
lock.lock();
try {
// 持有锁进行存款操作
balance += amount;
// 更新账户余额的其他逻辑...
} finally {
lock.unlock(); // 保证锁一定会被释放
}
}
public void withdraw(double amount) {
lock.lock();
try {
// 持有锁进行取款操作
if (balance >= amount) {
balance -= amount;
// 更新账户余额的其他逻辑...
}
} finally {
lock.unlock();
}
}
}
复制代码
乐观锁
乐观锁并不是Java自己提供的某种内置锁机制,而是指一种并发控制策略,它基于乐观假设:即在并发访问情况下,以为数据竞争不太可能发生,以是在读取数据时并不会立即加锁。乐观锁适用于读多写少的场景或者并发较少的场景。
Java中的乐观锁通过CAS(Compare and Swap / Compare and Set)算法实现,而数据库层面我们常利用版本号或者时间戳等进行控制。 CAS(Compare and Swap / Compare and Set): Java提供了java.util.concurrent.atomic包中的原子类,如AtomicInteger、AtomicLong等,它们通过CAS操纵来实现乐观锁。CAS操纵是一个原子指令,它只会修改数据,当且仅当该数据的当前值等于预期值时才进行修改。例如,AtomicInteger中的compareAndSet方法就是在乐观锁思想下实现的一种无锁化更新操纵。