悲观锁

指的是在每次更新数据(库)时都加上锁(定)这样多线程下只有一个程序可以今天这个方法进行更新

乐观锁

指的是在数据(库)里面加锁版本(或者精准时间戳)在更新前查询原来数据[标识版本(时间戳)]在修改时验证(标识版本[时间戳])是否相等不相等则不更新

悲观锁示例:

在Java中,使用 synchronized 关键字来实现悲观锁。

public class PessimisticLockExample {
    private int count = 0;

    public synchronized void increment() {
        // 这里使用悲观锁,即在操作前先加锁
        count++;
    }

    public synchronized int getCount() {
        return count;
    }
}

在上面的示例中,increment() 方法和 getCount() 方法都使用了 synchronized 关键字,这意味着在多个线程同时访问这两个方法时,会依次执行,从而避免了并发问题。

乐观锁示例:

乐观锁通常使用版本号(version)或时间戳等方式来实现,在Java中,可以使用 Atomic 类来实现乐观锁。

import java.util.concurrent.atomic.AtomicInteger;

public class OptimisticLockExample {
    private AtomicInteger count = new AtomicInteger(0);

    public void increment() {
        // 这里使用乐观锁,即直接更新数据,不加锁
        // count++;
        count.incrementAndGet();
    }

    public int getCount() {
        return count.get();
    }
}

在上面的示例中,increment() 方法使用了 AtomicInteger 类来实现对 count 的原子操作,而不需要使用 synchronized 关键字,因此在多线程并发情况下也能保证数据的正确性。

其中,悲观锁适用于并发冲突较多的场景,它假设并发冲突会经常发生,因此在操作前先加锁;而乐观锁适用于并发冲突较少的场景,它假设并发冲突较少,因此在操作时不加锁,而是在更新数据时检查是否有其他线程对数据进行了修改。