java中锁的相关知识

悲观锁: 悲观锁认为自己在操作访问数据时,一定会有其他线程来访问,为了保证数据的安全,他会对自己当前访问的资源(同步资源/同步代码块)上锁,在同一时间只能有一个线程进行操作,例如synchronized和ReentrantLock

乐观锁: 乐观锁认为自己在操作访问数据时,一定没有其他线程来访问,因此他不会对数据进行上锁,而是采用CAS算法(大致原理为该算法会检查数据是否被更改过,若未更改则正常修改当前资源‘,若修改过则根据设置报错或者给出对应提示) 

以上为具体锁

无锁 字面意思为没有任何锁,无锁采用循环修改的方式,多个线程循环直到修改资源为止,因此无锁一定能修改成功,是CAS算法的实现

偏向锁 当多个代码块被同一线程访问(这种情况很普遍。一般一个代码块由一个线程执行),该线程会自动获得锁。

轻量级锁 在当前线程获得偏向锁时,若此时有其他线程访问该资源,偏向锁将升级为轻量级锁,其他线程将阻塞。

重量级锁 重量级锁灰阻塞所有线程。

以上为锁的状态

公平锁:线程按照先后顺序排队访问资源,相较于非公平锁,公平锁的源码表明该锁会首先计算加入线程的顺序,根据顺序放到相应的位置。

非公平锁:线程在加入时会首先尝试插队,即直接尝试访问资源,若此时正好上一个线程执行完毕,当前线程将直接访问资源,因此会出现后加入的线程提前访问资源的情况

可重入锁:线程在方法外部获得锁时,进入该方法内部将自动获得锁。例如方法1和方法2两个synchronized方法,在调用方法1的时候,若该方法中包含着方法2,那么线程会自动获得方法2的锁,这在一定程度上可以避免死锁的问题。

不可重入锁:与可重入锁相对,无法自动获得锁。

posted @ 2020-11-30 20:12  NewToJava  阅读(54)  评论(1)    收藏  举报