乐观锁
每次去拿数据的时候都认为别人不会修改,在更新的时候会判断一下在此期间别人有没有去更新这个数据,通过版本号和CAS(比较并且交换)。
乐观锁适用于多读的应用类型
Java的原子变量类就是乐观锁的一种实现方式。
乐观锁的缺点
1,ABA问题
2,循环时间长开销大
3,只能保证一个共享变量的原子操作
悲观锁
每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。 Java 中 ReentrantLock 等独占锁就是悲观锁思想的实现。
synchronized会由乐观锁升级成悲观锁,随着竞争变大,最后会升级成重量级锁。
悲观锁适用于写操作更多的情况。