锁的分类
锁的分类:
悲观锁和乐观锁:乐观锁和悲观锁是并发控制的一种机制,用于多线程或多进程环境下对共享资源的访问管理,以防止数据不一致或竞态条件。它们的主要区别在于对待冲突的策略。
悲观锁是一种对资源持有较悲观态度的锁定方式。它假设数据在并发访问时极有可能发生冲突,因此每次访问数据时都会先加锁,以确保其他线程不能访问此数据直到锁被释放。
乐观锁则持相对乐观的态度,假设并发操作冲突的可能性较小,因此不会主动加锁,而是进行数据版本检查来决定是否提交操作。适用于读多写少的场景。
⾮⾃旋锁和自旋锁:主要是从未获取到锁是否要阻塞。
⾮⾃旋锁:未获取到锁不需要阻塞。比方说使用redis上锁的时候,可以加个超时时间。
自旋锁:未获取到锁需要阻塞,一直等到获取到锁。比方说CAS.
公平锁 和⾮公平锁:竞争锁的时候是否需要排队。
公平锁:竞争锁的时候是需要排队。
非公平锁:竞争锁的时候不需要排队。
比方说我们的ReentrantLock,默认是非公平锁,可以在构造方法中传入true,变成公平锁。
可重⼊锁 和不可重⼊锁:一个线程多个阶段是否能获取同一把锁。
可重入锁:一个线程多个阶段能够获取同一把锁。
不可重入锁:一个线程多个阶段不能够获取同一把锁。
比方说:ReentrantLock,ReentrantReadWriteLock底层的重入机制,每次重入都会给aqs的state变量加1记录重入次数。
共享锁和排他锁:多个线程是否共用一把锁。
共享锁:多个线程可以共用一把锁。
排他锁:多个线程不可以共用一把锁。
比方说读锁就是一种共享锁,写锁就是一种排他锁。