锁的分类

JUC


  • cpu多核
public class Test1 {
    public static void main(String[] args) {
        // 获取cpu核数
        // cpu密集型  io密集型
        System.out.println(Runtime.getRuntime().availableProcessors());
    }
}
  • wait会释放锁,sleep不会释放
  • wait必须在同步代码块中,sleep任意位置
  • wait不要捕获异常,sleep必须捕获

锁的分类

可重入锁

如果锁具备可重入性,则称作为可重入锁。像synchronized和ReentrantLock都是可重入锁。举个简单的例子,当一个线程执行到某个synchronized方法时,比如说method1,而在method1中会调用另外一个synchronized方法method2,此时线程不必重新去申请锁,而是可以直接执行方法method2。

可中断锁

synchronized就不是可中断锁,而Lock是可中断锁。如果某一线程A正在执行锁中的代码,另一线程B正在等待获取该锁,可能由于等待时间过长,线程B不想等待了,可以让它中断自己或者在别的线程中中断它。

公平锁

公平锁即尽量以请求锁的顺序来获取锁。多个线程在等待一个锁,当这个锁被释放时,等待时间最久的线程(最先请求的线程)会获得锁,这种就是公平锁。非公平锁即无法保证锁的获取是按照请求锁的顺序进行的。这样就可能导致某个或者一些线程永远获取不到锁。
synchronized就是非公平锁,它无法保证等待的线程获取锁的顺序。而对于ReentrantLock和ReentrantReadWriteLock,它默认情况下是非公平锁,但是可以设置为公平锁。

上一篇:python 树莓派


下一篇:Linux中打包和压缩的概念和区别