JUC并发学习之Lock锁
1.IDEA环境配置爬坑
1.1 在project中配置JDK对应的版本,本例中使用JDK1.8,下同。
1.2 在Modules中配置JDK对应版本,即使用JDK1.8。
1.3 java Compiler配置
默认一般是1.5需要改成需要的JDK版本,即使用JDK1.8。
2.JUC的定义
JUC是java.util.conurrent工具包,通常用于处理并发编程。
小知识点:
Thread类为线程类,Runnable接口(函数式接口)创建的线程是让类实现Runnable接口,然后给到线程类执行,Runnable接口是没有返回值的并且效率是低于Callable接口实现的线程,而Callable接口就是属于java.util.conurrent工具包。
2.1 线程和进程的定义
进程即CPU资源分配的最小单位,由多个线程组成,最少包含一个线程,是操作系统中的应用程序。
线程即CPU调度和执行的最小单位,是进程当中的一条执行路径,用来执行具体的任务和功能。
Java中默认的线程有两种:一种是main线程,还有一种是GC线程 垃圾回收。
java是不能开启线程的,只能通过本地的native方法(start0()调用底层的C++语言操作硬件)进行启动,因为Java无法直接操作硬件,是运行在虚拟机上的。
2.1.1 线程的生命周期
NEW(新生)==》RUNNABLE(运行)==》(BLOCKED(阻塞)、WAITING(等待,一直等待)、TIMED_WAITING(超时等待))==》TERMINATED(终止);
2.1.2 wait和sleep的区别
2.1.2.1 属于不同的类
wait属于Oject类,而sleep属于Thread类;
2.1.2.2 是否释放锁
wait会释放锁,sleep不会释放锁;
2.1.2.3 使用的范围不同
wait必须在同步代码块中使用,sleep可以在任意地方使用;
2.1.2.4 是否需要补货异常
wait和sleep必须捕获中断异常;
2.2 并发和并行
并发即多个线程操作同一个资源,一个时间段交替进行;
并发编程是为了充分利用cpu的资源;
并行即多个线程操作同一个资源,同一时间同时执行;
可以通过Runtime.getRuntime().availableProcessors()来获取本机的逻辑处理器个数,即本机最大同时可以执行的线程个数(cpu核数);
3.解决并发之Lock锁
3.1 使用Synchronized修饰词修饰资源类的调用方法;
3.2 使用JUC包下的Lock锁
3.2.1 JUC包下的Lock接口有三个实现类ReentrantLock(可重入锁,通常都使用这个)、ReentrantReaderWriterLock.ReadLock(读锁)、ReentrantReaderWriterLock.WriterLock(写锁)
3.2.2 创建ReentrantLock可重入锁
默认使用无参数的非公平锁为了公平执行,可以插队处理;
有布尔参数的构造器为公平锁,按照先入先出,后入后出的顺序执行。
public ReentrantLock() {
sync = new NonfairSync();
}
public ReentrantLock(boolean fair) {
sync = fair ? new FairSync() : new NonfairSync();
}
小知识点:IDEA操作快捷键Ctrl+Alt+T可以将光标放在需要加逻辑判断等的代码上或后边,可以给这段代码快速加上逻辑判断、try/catch、循环等;
3.2.3 使用Lock锁的步骤
3.2.3.1 new 一个Lock接口的实现类
3.2.3.2 加锁,通过对象调用lock()方法;
3.2.3.3 try/catch/finally,其中业务代码放到try中;
3.2.3.4 解锁,在finally中通过对象调用unlock()方法;
3.3 Synchronized和Lock锁的区别
3.3.1 定义不同
Synchronized是java内置关键字,Lock是一个接口;
3.3.2 是否获取锁
Synchronized无法判断获取锁的状态,Lock可以判断是否获取锁
3.3.3 是否释放锁
Synchronized会自动释放锁,Lock必须手动释放锁,如果不释放会造成死锁;
3.3.4 遇到阻塞等突发情况
Synchronized如果获取锁的线程阻塞了,其他线程会一直等待这个线程;
Lock锁可以通过trylock()方法尝试获取锁,面对这种突发事情,不用一直等待下去;
3.3.5 是否可变
Synchronized是默认可重入锁,并且不可中断,采用非公平方式,可以插入别的线程,但是因为是内置的关键字所以不可改变;
Lock锁默认也是可重入锁,可以判断是否中断,可以设置是否是公平方式(在构造器中传入true就是公平模式),因此是可变可手动控制的。
3.3.6 适用范围
Synchronized适用于锁少量的代码同步问题,Lock锁适用于锁大量的同步代码。
3.3.7 显隐性
Synchronized是隐式的,Lock锁是显式的扩展性更好,Lock锁可以精准唤醒;
- 点赞
- 收藏
- 关注作者
评论(0)