乐观锁
认为别人不会修改,再修改后,在更新的时候会判断一下在此期间别人有没有去更新这个数据;
例子:原子类
乐观锁是通过CAS(Compare And Swap 比较并且替换)实现的
谈一下CAS
CAS就是线程在读取数据时不进行加锁,在准备写回数据时,先去查询原值,操作的时候比较原值是否修改,若未被其他线程修改则写回,若已被修改,则重新执行读取流程。
CAS的缺点
1、如果数据老是被修改,那么会造成性能的浪费,总是进入循环;
2、ABA问题
什么时ABA问题
例如:
当线程A修改变量i时,变量i从i变成了i+1,又从i+1变成了i,而线程A并没有发现。当然,对最终的结果没有影响。但是需要防范。
悲观锁
认为别人一定也会修改,
例子:synchronized关键字、ReentrantLock
独享锁
是指该锁一次只能被一个线程所持有。
共享锁
是指该锁可被多个线程所持有。
举例:
有些锁对于写时关闭的,但是对于读时多个线程开发的。
互斥锁(排斥锁)
公平锁
如果一个线程组里,能保证每个线程都能拿到锁,那么这个锁就是公平锁。
锁是有量级之分的
如轻量级的CAS实现的乐观锁
我们为什么说一个锁是重量锁,深层原因?
什么是锁的自旋?
后面请求锁的线程没拿到锁的时候,不挂起线程(阻塞),而是继续占用处理器的执行时间,让当前线程执行一个忙循环(自旋操作)。
什么是偏向锁
Java偏向锁(Biased Locking)是Java6引入的一项多线程优化。
偏向锁,顾名思义,它会偏向于第一个访问锁的线程,如果在运行过程中,同步锁只有一个线程访问,不存在多线程争用的情况,则线程是不需要触发同步的,这种情况下,就会给线程加一个偏向锁。
如果在运行过程中,遇到了其他线程抢占锁,则持有偏向锁的线程会被挂起,JVM会消除它身上的偏向锁,将锁恢复到标准的轻量级锁。