悲观锁与乐观锁

Posted 胡东

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了悲观锁与乐观锁相关的知识,希望对你有一定的参考价值。

何为悲观锁

每次都假设最坏的情况,每次拿数据都认为别人会修改,所以每次在拿数据时都会进行加锁操作。Java中synchronized和ReentrantLock等独占锁就是悲观锁思想的实现。

何为乐观锁

每次都假设最好的情况,每次拿数据都认为别人不会修改,所以每次在拿数据时都不会上锁,但如果进行更新操作,便会判断其他人是否在此期间已经进行过更新的操作,可以使用版本号和CAS算法(Compare And Swap,比较与交换算法)来实现。

两种锁的使用场景

悲观锁多使用于多写的场景下
乐观锁多使用于多读的场景下

两种锁的代码实现

悲观锁实现计数器

使用synchronized实现:

public class Counter{
    private int count;
    public synchronized int count(){
        return ++count;
    }
}

使用Lock实现:

public class Counter{
    private int count;
    private Lock lock = new ReetrantLock();
    public int count(){
        lock.lock();
        try{
            return ++count;
        }finally{
            lock.unlock();
        }
    }
}

乐观锁实现计数器

public class Counter{
    private AtomicInteger ai = new AtomicInteger();
    public int count(){
        return ai.incrementAndGet();    //AtomicInteger类使用到了CAS算法
    }
}

以上是关于悲观锁与乐观锁的主要内容,如果未能解决你的问题,请参考以下文章

协作式原创查漏补缺之乐观锁与悲观锁TODO

乐观锁与悲观锁

面试必备----------------乐观锁与悲观锁

MYSQL悲观锁与乐观锁

[初级]深入理解乐观锁与悲观锁

悲观锁与乐观锁