看完你就知道的乐观锁和悲观锁
目录 Java 锁之乐观锁和悲观锁 悲观锁 乐观锁 两种锁的使用场景 乐观锁的实现方式 版本号机制 CAS 算法 乐观锁的缺点 ABA 问题 循环开销大 CAS与synchronized的使用情景 Java 锁之乐观锁和悲观锁 Java 按照锁的实现分为乐观锁和悲观锁,乐观锁和悲观锁并不是一种真实存在的锁,而是一种设计思想,乐观锁和悲观锁对于理解 Java 多线程和数据库来说至关重要,那么本篇文章就来详细探讨一下这两种锁的概念以及实现方式。 悲观锁 悲观锁 是一种悲观思想,它总认为最坏的情况可能会出现,它认为数据很可能会被其他人所修改,所以悲观锁在持有数据的时候总会把 资源 或者 数据 锁住,这样其他线程想要请求这个资源的时候就会阻塞,直到等到悲观锁把资源释放为止。传统的关系型数据库里边就用到了很多这种锁机制, 比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。 悲观锁的实现往往依靠数据库本身的锁功能实现。 Java 中的 Synchronized 和 ReentrantLock 等独占锁(排他锁)也是一种悲观锁思想的实现,因为 Synchronzied 和 ReetrantLock 不管是否持有资源,它都会尝试去加锁,生怕自己心爱的宝贝被别人拿走。 乐观锁 乐观锁的思想与悲观锁的思想相反,它总认为资源和数据不会被别人所修改,所以读取不会上锁