悲观锁
指的是在每次更新数据(库)时都加上锁(定)这样多线程下只有一个程序可以今天这个方法进行更新
乐观锁
指的是在数据(库)里面加锁版本(或者精准时间戳)在更新前查询原来数据[标识版本(时间戳)]在修改时验证(标识版本[时间戳])是否相等不相等则不更新
悲观锁示例:
在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 关键字,因此在多线程并发情况下也能保证数据的正确性。
其中,悲观锁适用于并发冲突较多的场景,它假设并发冲突会经常发生,因此在操作前先加锁;而乐观锁适用于并发冲突较少的场景,它假设并发冲突较少,因此在操作时不加锁,而是在更新数据时检查是否有其他线程对数据进行了修改。