synchronized vs CAS

optimjie / 2023-08-11 / 原文

虽然标题为synchronized vs CAS,但从大的范围来说其实是:悲观锁 vs 乐观锁,本文使用synchronized和CAS来进行介绍,并对比。

首先锁的出现是为了,保证同一时间内,只有一个线程进入临界区。

什么是悲观锁和乐观锁?

悲观锁:对于同一个数据的并发操作,悲观锁认为自己在使用数据的时候一定有别的线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被别的线程修改。Java中,synchronized关键字和Lock的实现类都是悲观锁。
乐观锁:乐观锁认为自己在使用数据时不会有别的线程修改数据,所以不会添加锁,只是在更新数据的时候去判断之前有没有别的线程更新了这个数据。如果这个数据没有被更新,当前线程将自己修改的数据成功写入。如果数据已经被其他线程更新,则根据不同的实现方式执行不同的操作(例如报错或者自动重试)。

synchronized实现原理

static final Object lock = new Object();
static int cnt = 0;
public static void main(String[] args) {
    synchronized (lock) {
        cnt++;
    }
}

查看对应的字节码会发现: