- 乐观锁
乐观锁是一种乐观思想,即认为读多写少,遇到并发写的可能性低,采取在写时先获取当前版本号,然后加锁的操作,如果失败,则要重复读-比较-写的操作;java中的乐观锁基本都是彩玉CAS算法实现的,比较当前值和传入值是否一样,一样则更新;
- 悲观锁
悲观锁是一种悲观思想,即认为写多,如synchronized,行锁表锁等
- 自旋锁
当持有锁的线程很短时间释放资源,那其他的线程无需进入阻塞状态,只需要自旋等待,等持有锁的线程释放锁后立即获取锁。
synchronsized作用范围
1、作用于方法时,锁住的是对象的实例,this;
2、作用于静态方法时,锁住的是class实例,永久带时共享的,因此静态方法锁相当于类的一个全局锁,会锁所有调用该方法的线程
CAS算法
比较并交换,cas算法包含三个值,内存中的值,预估值和即将修改的新增,当预估值和北村中的值相等时才会更新为即将修改的新增。cas是一种无锁算法。
CAS非阻塞,可以避免优先级倒置和死锁问题;性能好,为无锁算法;
ABA问题:当cas比较预估值和内存中的值时,若一致则认为未修改则更新,需要使用java的原子引用类,通过控制数值的版本来保证cas的准确性;
死锁问题
1、互斥条件:一个资源只能被一个线程持有直到释放
2、不可抢占:线程不可抢占其他线程已持有的资源
3、请求和保持:线程在等待其他资源时对持有的资源不释放
4、循环等待:线程A持有线程B的资源等待线程B持有的资源,线程死锁;