2022-08-04 第三小组 陈迪 学习笔记
LockSupport工具类
线程阻塞的工具类,所有的方法都是静态方法,可以让线程在任意位置阻塞,阻塞之后也有唤醒的方法。
park:停车,如果我们把thread看成一辆车的话,park就是让车停下。
unpark:就是让车启动然后跑起来。
park和unpark实现的是wait和notify的功能。
区别:
1、park不需要获取某个对象的锁
2、因为中断park不会抛出InterruptedException异常,需要在park之后自行判断中断状态,然后做额外的处理。
总结:
1、park和unpark可以实现wait和notify的功能,但是并不和wait和notify交叉使用。
2、park和unpark不会出现死锁。
3、blocker的作用看到阻塞对象的信息。
Lock:
是一个接口,
键盘输入和打印输出极其耗资源的IO操作,开发中不允许使用。
Lock接口的实现类:ReentrantLock
ReentrantLock,可重入锁
实现了Lock接口
synchronized和Lock区别:
1、Lock是一个接口,synchronized是一个关键字,是由底层c语言实现的。
2、synchronized发生异常时,会自动释放线程占用的锁不会发生死锁。
Lock发生异常,若没有主动释放,极有可能占用资源不放手,需要在finally中手动释放锁。
3、Lock可以让等待锁的线程响应中断,使用synchronized只会让等待的线程一直等待下去,不能相应中断。
4、Lock可以提高多个线程进行读操作的效率。
Lock锁:
原理:cas和aqs
synchronized是由c语言实现的,只能作为关键字使用
Java提供了一些并发的编程的包,底层的实现原理cas和aqs
编发编程三大特性:
1、原子性:原子操作可以是一个步骤,也可以是多个步骤,但顺序不能乱,整个操作视为一个整体,不可以切割只执行其中一部分,不仅仅是多行代码,也可能是多条指令。
2、可见性
3、有序性
synchronized Lock:可以保证原子性,可见性,有序性
CAS:compare and swap 比较并交换。jdk11改成了compare and set
思路:给一个元素赋值时,先看看内存里那个值到底变没变
AQS:抽象队列同步器,用来解决线程同步执行的问题。它是一个双向链表。
JUC并发编程包
1、原子类Atomic
AtomicInteger:整型原子类
AtomicLong:长整型原子类
AtomicBoolean:布尔型原子类
线程池:
为什么要使用线程池
1、降低资源消耗,通过重复利用已创建的线程·降低的创建和销毁线程造成的资源消耗
2、提高响应速度,当任务到达时,任务可以不需要等到县城创建就能立即执行
3、提高线程的可管理性,县城比较稀缺的资源,如果无限制创建,不仅会消耗系统资源,还会降低系统稳定性,使用线程池可以进行统一的分配,调优和监控
jdk自带四种线程池通过xecutors提供的。
newCachedThreadPool:创建一个可缓存的线程池,如果线程池长度超过处理需要,可以灵活回收空闲线程,若无可回收,创建新的线程池。
newFixedThreadPool:创建一个定长的线程池,可以控制线程最大并发数,超出的线程会在队列中等待
newScheduledThreadPool:创建一个定长的线程池,支持定时及周期性任务执行
newSingleThreadExecutor:创建一个单线程化的线程池,他只会用唯一的工作线程来执行任务,保证所有的任务按照指定顺序执行
这四种线程池的初始化都调用了同一个构造器:
ThreadPoolExecutor(int corePoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue
ThreadFactory threadFactory ,RejectedExecutionHandler handler)
参数的意义(重要):
corePoolSize:线程池里线程的数量,,核心线程池大小
maximumPoolSize:指定了线程池里的最大线程数量
keepAliveTime:当线程池线程数量大于corePoolSize,多出来的空闲线程,多长时间被销毁
unit:时间单位
workQueue:任务队列,用于存放提交但是尚未被执行的任务。
threadFactory:线程工厂,用来创建线程,线程工厂就是我们new线程的。
handler:拒绝策略,是将任务添加到线程池中时,线程池拒绝该任务多采取的响应的措施
常见的工作队列:
ArrayBlockingQueue:基于数组的有界阻塞队列。FIFO
LinkedBlockingQueue:基于链表的有界阻塞队列。FIFO
线程提供了四种拒绝策略:
AbortPolicy:直接抛出异常,默认的策略。
CallerRunPolicy:用调用者所在的线程执行任务
DiscardOldestPolicy:丢弃阻塞队列中最靠前的任务·,并执行当前任务。
需要掌握:
创建线程四种方式;线程同步;synchronized,reentrantlock,reentrantreadwritelock
线程之间的通信;wait,notify,notifyAll
线程类的常用方法。
心得体会:
今天学习了LockSupport工具类,感觉内容比较深奥,较难理解,但是经过同学的讲解,做出了今晚的作业,也学到了好多东西,自己要继续努力,争取更进一步。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】