关于多线程:悲观锁与乐观锁

何为乐观锁

每次都假如最坏的状况,每次拿数据都认为他人会批改,所以每次在拿数据时都会进行加锁操作。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算法
    }
}

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理