悲观锁
总是做最坏的打算,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。适用于多写的情形
常用的实现方式:synchronized,ReentrantLock
缺点:对于资源竞争较少的情况,使用synchronized同步锁进行线程阻塞和唤醒切换以及用户态内核态间的切换操作额外浪费消耗cpu资源
乐观锁
总是做最好的打算,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号机制和CAS算法实现。java.util.concurrent.atomic
包下面的原子变量类就是使用了乐观锁的一种实现方式CAS实现的。适用于多读的情形
优点:冲突真的很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量
缺点:如果是多写的情况,一般会经常产生冲突,这就会导致上层应用会不断的进行retry,这样反而降低了性能