锁:实现操作的同步或者可以说对操作公共的资源进行一个限制
锁的分类:
1.排他锁(重点)和共享锁
排他锁:获得锁资源之后那么不能对这个资源进行任何的读写操作,这些操作就会进行阻塞
共享锁:获得锁资源之后,只能对这个资源进行相关的读操作不能对其进行写操作
案例: 就是在Mysql当中对一个数据进行 修改(增改删) 操作的时候就是对这个数据加上排他锁
加共享锁使用 select *** for updata 或者 select*** lock in share mode
2.可重入锁和不可重入锁:
这个的主要区别就是在于一个线程是否可以实现多次获得同一个锁资源 可重入锁是可以的 不可重入锁是不可以的,最经典的就是AQS volatile关键在后期在JUC主题下会细说
3.乐观锁和悲观锁
对于乐观锁和悲观锁在我看来不是真正的锁而是一种思想的体现
乐观锁(无锁):简单来说不是通过锁的方式来实现对于资源的操作 典型案例就是CAS操作
主要的操作步骤:
四大参数:对象 地址偏移量 预期值 更新后的值
如果并发量高的话这个是会消耗大量系统的资源
后期在JUC会仔细说
悲观锁(加锁):对需要操作的资源先加上锁,只有获得锁的线程才能够对资源进行操作
4.单机锁和分布式锁
单机锁:在单体架构中锁如ReentrantLock,Synchronized(后期会细说这二者之间的区别)
分布式锁(Redis来进行实现 后期会细说):在分布式的架构中多个系统需要对同一个系统进行操作的时候来实现的或者在售卖打折商品的时候防止超卖
比如 : 库仓服务进行补货的时候那么这个时候就需要对库存服务里面的商品的库存进行数据的修改 用户正好下单对商品的库存进行减少的操作的时候,这个时候我们只能让其中一个服务来对库仓服务里面的数据进行操作不然的话会出现数据的不一致问题
5.公平锁和非公平锁
公平锁:在获取锁资源的时候就是需要判断阻塞队列中是否有正在等待获取资源的线程
非公平锁:与公平锁情况相反不需要判断阻塞队列中是否有正在等待获取资源的线程
特例: 就是说正好锁资源释放的时候,我实现了非公平锁那么就会之间进行加锁的操作这个时候就会加锁成功 最经典的就是reentrantlock