目录
一、什么是乐观锁和悲观锁?
(Pessimistic Locking),具有强烈的独占和排他特性。它指的是对数据悲观锁被外界修改持保守态度。因此,在整个执行过程中,将处于锁定状态。所以,悲观锁是一种悲观思想,它总认为最坏的情况可能会出现,它认为数据很可能会被其他人所修改,所以悲观锁在持有数据的时候总会把资源或者数据锁住,这样其他线程想要请求这个资源的时候就会阻塞,直到等到悲观锁把资源释放为止。 Java中的Synchronized和ReentrantLock 是一种悲观锁思想的实现,因为Synchronzied和ReetrantLock 不管是否持有资源,它都会尝试去加锁。
乐观锁(Optimistic Locking) 相对悲观锁而言,乐观锁机制采取了更加宽松的加锁机制。乐观锁的思想与悲观锁的思想相反,它总认为资源和数据不会被别人所修改,所以读取不会上锁,但是乐观锁在进行写入操作的时候会判断当前数据是否被修改过。Java 中的 stampedLock 和 AtomicInteger 是一种乐观锁思想的实现
1.ReentrantLock
ReentrantLock 保证了只有一个线程可以执行临界区代码。但是有些时候,这种保护有点过头。因为我们发现,任何时刻,只允许一个线程修改,也就是调用 inc() 方法是必须获取锁,但是, get() 方法只读取数据,不修改数据,它实际上允许多个线程同时调用。实际上我们想要的是: 允许多个线程同时读