JUC并发学习之Lock锁

举报
多米诺的古牌 发表于 2021/07/25 22:55:00 2021/07/25
【摘要】 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类为线程类,...

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锁可以精准唤醒;



【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。