图片引用自:GitChat
线程是否需要对资源加锁分为两类
悲观锁
悲观锁是一种消极的思想,它总是认为会有最坏的情况出现,它总是认为数据是会被修改的,所以它会在持有资源的时候把资源和数据锁住。这样其他的线程要请求这个资源的时候就会被阻塞,直到悲观锁把资源释放了。悲观锁有许多的应用场景,最常见的就是我们经常使用的的传统关系型数据库的锁机制。比如行锁,表锁,读锁,写锁这些都是在要资源操作之前加锁。悲观锁的实现往往依靠数据库自身实现的。悲观锁适用于读少写多的场景
Java中Synchronized和ReetrantLock等独占锁都是悲观锁思想的实现。
乐观锁
乐观锁体现的是悲观锁的反面。它是一种积极的思想,它总是认为数据是不会被修改的,所以是不会对数据上锁的。但是乐观锁在更新的时候会去判断数据是否被更新过。乐观锁的实现方案一般有两种(版本号机制和CAS)。乐观锁适用于读多写少的场景,这样可以提高系统的并发量。在Java中 java.util.concurrent.atomic下的原子变量类就是使用了乐观锁的一种实现方式CAS实现的。
乐观锁实现的两种方式
乐观锁一般会