乐趣区

Java中的锁之乐观锁与悲观锁

1、分类一:乐观锁与悲观锁
a) 悲观锁:认为其他线程会干扰本身线程操作,所以加锁
i. 具体表现形式:synchronized 关键字和 lock 实现类

b) 乐观锁:认为没有其他线程会影响本身线程操作,所以不加锁
i. 具体表现形式:java 的原子类的递增操作

ii. 原理:采用 cas 算法

c)Cas 算法:交换与比较
i. 涉及三个数:需要读写的内存值 V,进行比较的值 A,要写入的新值 B

ii. 具体操作:若 A =V, 就用 B 更新 V, 否则不进行任何操作

iii. 会用 ABA 问题:cas 算法需要判断内存值 V 是否发生变化,如果 a 值变成 b 值然后又变回 a 值,cas 算法就会无法判断,产生错误。解决上问题:在变量前添加版本号,将 aba 变成 1a2b3c

iv. 循环时间长开销大,因为自旋需要消耗 cpu

v. 只能保证一个共享变量的原子操作

2、分类二
a) 重入锁:支持重进入的锁,排它锁
3、分类三
a) 读写锁:一对锁,读锁,写锁,在同一时刻允许多线程访问

退出移动版