作用:
- 并发场景下控制多个执行实体对共享资源的访问,资源有限,保证操作不互相干扰
- 多个执行实体之间的同步、互斥机制,比如Java内置对象锁,控制多线程对代码临界区的访问
举例:
- MySQL程序的锁是用来实现事务隔离,此时共享的是数据
- Java的锁是多线程并发访问对象,此时共享的是对象
- Linux的锁是多进程并发访问共享内存、内核、共享链接库的
举例:图书馆有个意见簿,
分类:
- 乐观锁:
- CAS自旋锁:临界区短暂时,自旋等待来获取锁,读取一个值修改后,通过Compare And Set,如果准备修改时发现值没变化就修改,变化了就回滚
- ABA
- 多个空自旋
- 单个变量
- MVCC:多版本控制
- 悲观锁:对数据操作时必须加锁
- 互斥锁:
- 可重入锁:是否允许持有锁的实体再次获取同一把锁
- 共享锁:允许多个实体访问某个资源
- 读写锁:读写分离,读共享、写互斥
悲观锁和乐观锁的区别
主要区别在于获取锁失败后,是否阻塞进程
- 阻塞:系统调用,引起上下文切换
- 不阻塞:占CPU资源
MySQL中的锁
Innodb通过锁来实现事务隔离,控制对数据表、记录行的访问
Java中的锁
synchronized内置锁:
- 偏向锁:不加锁
- 轻量锁:自旋锁
- 重量锁:互斥锁
ReentrantLock可重入锁
ReadWriteReentrantLock可重入读写锁