miluframe({ /*个人链接地址*/ Youself:'https://www.cnblogs.com/miluluyo/', /*导航栏信息*/ custom:[{ name:'留言板', link:'https://www.cnblogs.com/miluluyo/p/11578505.html', istarget:false },{ name:'技能树', link:'https://miluluyo.github.io/', istarget:true }], /*自己的友链页面后缀*/ Friends_of_the:'p/11633791.html', /*自己的友链信息*/ resume:{ "name":"麋鹿鲁哟", "link":"https://www.cnblogs.com/miluluyo", "headurl":"https://images.cnblogs.com/cnblogs_com/elkyo/1558759/o_o_my.jpg", "introduction":"大道至简,知易行难。" }, /*友链信息*/ unionbox:[{ "name":"麋鹿鲁哟", "introduction":"生活是没有标准答案的。", "url":"https://www.cnblogs.com/miluluyo", "headurl":"https://images.cnblogs.com/cnblogs_com/elkyo/1558759/o_o_my.jpg" },{ "name":"麋鹿鲁哟的技能树", "introduction":"大道至简,知易行难。", "url":"https://miluluyo.github.io/", "headurl":"https://images.cnblogs.com/cnblogs_com/elkyo/1558759/o_o_my.jpg" }], /*点击页面时候的弹出文本显示*/ clicktext:new Array("ヾ(◍°∇°◍)ノ゙加油哟~ ——麋鹿鲁哟","生活是没有标准答案的。 ——麋鹿鲁哟"), /*github链接*/ githuburl:'https://github.com/miluluyo' })

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,BlockingQueueworkQueue,

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工具类,感觉内容比较深奥,较难理解,但是经过同学的讲解,做出了今晚的作业,也学到了好多东西,自己要继续努力,争取更进一步。

posted @   jinjidecainiao  阅读(25)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
@media only screen and (max-width: 767px){ #sidebar_search_box input[type=text]{width:calc(100% - 24px)} } L2Dwidget.init({ "model": { jsonPath: "https://unpkg.com/live2d-widget-model-hijiki/assets/hijiki.model.json", "scale": 1 }, "display": { "position": "left", "width": 100, "height": 200, "hOffset": 70, "vOffset": 0 }, "mobile": { "show": true, "scale": 0.5 }, "react": { "opacityDefault": 0.7, "opacityOnHover": 0.2 } }); window.onload = function(){ $("#live2dcanvas").attr("style","position: fixed; opacity: 0.7; left: 70px; bottom: 0px; z-index: 1; pointer-events: none;") } 参数说明 名称 类型 默认值/实例 描述Youself 字符串 https://www.cnblogs.com/miluluyo/ 个人博客园首链接 custom 数组 [{ name:'相册', link:'https://www.cnblogs.com/elkyo/gallery.html', istarget:false },{ name:'技能树', link:'https://miluluyo.github.io/', istarget:true },{ name:'留言板', link:'https://miluluyo.github.io/p/11578505.html', istarget:false }] 导航信息 name 导航名 link 导航链接 istarget true跳转到新页面上,false当前页面打开 Friends_of_the 字符串 11633791 友链文章的后缀名,若字符串为空则不显示友链 resume 对象 { "name":"麋鹿鲁哟", "link":"https://www.cnblogs.com/miluluyo/", "headurl":"https://images.cnblogs.com/cnblogs_com/ elkyo/1558759/o_o_my.jpg", "introduction":"大道至简,知易行难。" } 自己的友链信息 name 导航名 link 导航链接 headurl 头像 introduction 语录 unionbox 数组 [{ "name":"麋鹿鲁哟", "introduction":"生活是没有标准答案的。", "url":"https://www.cnblogs.com/miluluyo", "headurl":"https://images.cnblogs.com/cnblogs_com/ elkyo/1558759/o_o_my.jpg" },{ "name":"麋鹿鲁哟的技能树", "introduction":"大道至简,知易行难。", "url":"https://miluluyo.github.io/", "headurl":"https://images.cnblogs.com/cnblogs_com/ elkyo/1558759/o_o_my.jpg" }] 友链数组 name 昵称 introduction 标语 url 链接地址 headurl 头像地址 clicktext 新数组 new Array("ヾ(◍°∇°◍)ノ゙加油哟~ ——麋鹿鲁哟", "生活是没有标准答案的。 ——麋鹿鲁哟"), 点击页面时候的弹出显示 githuburl 字符串 https://github.com/miluluyo github链接
点击右上角即可分享
微信分享提示