常见java,数据库锁汇总篇,舍我其谁

一 锁概念

1.1 java锁介绍

1.乐观锁
在select的时候不会加锁,是基于程序实现的,所以不会存在死锁的情况。
适用于读多写少的场景(写的并发量相对不高),可以提高系统的吞吐量。
因为如果写多的话,乐观锁会有很大机率更新失败,需要不断的自旋执行查找和更新操作。
自旋的时候会一直占用CPU,会耗费大量的CPU资源。

采取了更加宽松的加锁机制,大多是基于数据版本( Version )及时间戳来实现。。适合于读比较多,不会阻塞读

2.悲观锁:
在select的时候就会加锁,采用先加锁后处理的模式,虽然保证了数据处理的安全性,但也会阻塞其他线程的写操作。
悲观锁适用于写多读少的场景,因为拿不到锁的线程,会将线程挂起,交出CPU资源,可以把CPU给其他线程使用,提高了CPU的利用率。

 具有强烈的独占和排他特性,在整个数据处理过程中,将数据处于锁定状态。适合于写比较多,会阻塞读操作。

3.独占锁、互斥锁、排他锁:保证在任一时刻,只能被一个线程独占排他持有。synchronized、ReentrantLock
4.共享锁:可同时被多个线程共享持有。CountDownLatch倒计数器、Semaphore信号量

5.可重入锁:又名递归锁。同一个线程在外层方法获取锁的时候,在进入内层方法时会自动获取锁。
6.不可重入锁:不能递归的锁。

7. 公平锁:有优先级的锁,先来先得,谁先申请锁就先获取到锁

8.非公平锁:无优先级的锁,后来者也有机会先获取到锁
9. 自旋锁:当线程尝试获取锁失败时(锁已经被其它线程占用了),无限循环重试尝试获取锁

10.阻塞锁:当线程尝试获取锁失败时,线程进入阻塞状态,直到接收信号后被唤醒。在竞争激烈情况下,性能较高。

11.读锁:共享锁

12.写锁:独占排他锁

13.锁的升级过程: 无锁 --> 偏向锁(同一个线程再次获取锁) --> 轻量级锁(自旋) --> 重量级锁

偏向锁:一直被一个线程所访问,那么该线程会自动获取锁
    轻量级锁(CAS):当锁是偏向锁的时候,被另一个线程所访问,偏向锁就会升级为轻量级锁,
        其他线程会通过自旋的形式尝试获取锁,不会阻塞,提高性能。
    重量级锁:当锁为轻量级锁的时候,另一个线程虽然是自旋,但自旋不会一直持续下去,当自旋一定次数的时候(10次),
        还没有获取到锁,就会进入阻塞,该锁膨胀为重量级锁。重量级锁会让他申请的线程进入阻塞,性能降低。
    以上其实是synchronized的锁升级过程

1.2 db锁介绍

表级锁:粗粒度的锁,对整张表加锁,加锁快开销小,不会出现死锁,但并发度低,会增加锁冲突的概率;
行级锁:是mysql粒度最小的锁,只针对操作行加锁,加锁慢开销大,会出现死锁,并发度高,但可大大减少锁冲突概率;

1.3 概述

ReentrantLock悲观的独占的可重入的可公平可不公平锁

 synchronized悲观的独占的可重入的非公平锁

你可能感兴趣的:(java,数据库,java,开发语言)