多线程学习笔记(四)-- 常见类及使用

news2024/12/24 9:37:41

1. thread的方法

Thread.sleep():占用cpu资源

Thread.yeild():当前线程让渡cpu资源,大家竞争,也有再抢到cpu的机会

t1.join():在t2线程中,调用t1.join(),是等待t1执行完成

2. 线程状态

3. synchronized

程序出现异常,synchronized锁默认会释放

synchronized锁的是对象,不是代码

synchronized锁的对象不能是String常量、Integer、Long

4. 单例的双重检查为什么要用volatile

因为 instance = New Singleton()

指令重排时,可能将半初始化的对象赋值给instance

5. LongAdder

LongAdder用于多线程给同一个数递增使用,内部使用分段锁,线程数越多效率越高

6. 可重入

同一个线程多次申请同一把锁时,依然可以执行

7. ReentrantLock

synchronized是自动解锁的,Lock需要手动解锁lock.unlock(finally)

ReentrantLock有一个tryLock方法,尝试获取锁

ReentrantLock可以被打断(lock.lockInterruptibly() ),synchronized不可以

ReentrantLock默认非公平锁,可以设置为公平锁:new ReentrantLock(true) 

8. CountDownLatch

CountDownLatch:用于倒数,可以设置倒数值

latch.countDown() 等待数-1

latch.await() 直到等待数

9. CyclicBarrier

CyclicBarrier用于等待一定数量的线程后执行new CyclicBarrier(100,()->{});

10. Phaser

Phaser:按照不同的阶段对线程进行执行,需要重写onAdvance方法

11. ReadWriteLock:读写锁

读的时候加共享锁,其他读线程可以继续读,写线程不可以进入

写的时候加排他锁,其他线程不可以读也不可以写

12. Semaphore

可以用于限流,限制同时有多少线程执行

acquire() 获取锁

release() 释放锁

13. Exchanger

Exchanger:用于线程之间交换数据,交换数据时是阻塞的

14. LockSupport

LockSupport.park()阻塞当前线程

LockSupport.unpark(t) 继续运行t线程

unpark方法可以先于park方法调用

15. condition

Lock可以指定条件  lock.newCondition()

condition.await()方法可以让一定条件的线程wait

condition.signalAll()方法唤醒一定条件的线程

16. AQS: AbstractQueuedSynchronizer

AQS的核心是共享的state变量,volatile修饰的,通过CAS的方式给state设值;还有一个双向链表,没有获取到锁的线程通过CAS的方式加到链表的末端tail

为什么要设值成双向链表,因为后面的节点需要拿到前面的节点

17.VarHandle

变量句柄,引用,普通属性可以进行原子性操作;比反射快,可以直接操作二进制码

18.ThreadLocal

线程本地变量,线程a设值的值不影响线程b

使用完ThreadLocal后需要调用remove方法,要不然会有内存泄漏的问题

19. java的引用

分为强软弱虚

强引用:Object o = new Object(); 

软引用:SoftReference,当一个对象对软引用指向时,只有内存不够时,才会被垃圾回收掉

弱引用:WeakReference,只要遭遇gc就会回收,一般用于容器中,ThreadLocal的Entry使用了弱引用

虚引用:PhantomReference,虚引用被垃圾回收时会收到一个通知,可以用于NIO的直接内存清理时,发出通知清理堆外内存

( 垃圾回收的时候,会调用finlize方法,可以看到对象被回收了)

20. 为什么threadLocal的 Entry要使用弱引用?

若是强引用,即使threadLocal=null,但key的引用依然指向ThreadLocal对象,所以会有内存泄漏,而使用弱引用则不会

21. ExecutorService

ExecutorService的submit返回值是Future,线程池的返回值会存在Future中,通过get获取

22. FutureTask

FutureTask:本身既是Runnable也是Future,可以创建任务,也可以保存返回值

23. CompletableFuture

CompletableFuture可以管理一堆任务,等待全部执行结束CompletableFuture.allOf(cf1,cf2,cf3).join()

24. 默认的 ThreadPoolExecutor

Executors.newSingleThreadExecutor(): 单线程的线程池,保证任务有序执行

为什么要有单线程的线程池:方便管理线程池生命周期;阻塞队列;

Executors.newCachedThreadPool():核心线程数为0,最大线程数是int的最大值,阻塞队列是SynchronousQueue

Executors.newFixedThreadPool():固定长度

Executors.newScheduledThreadPool():用于执行定时任务,阻塞队列是DelayedWorkQueue,可以指定多久执行一次任务池任务(service.schedulAtFixedRate)

自定义拒绝策略需要实现RejectExecutionHandler

ThreadPoolExecutor的Worker

 

25.ForkJoinPool

ForkJoinPool:分解汇总的任务,用很少的线程可以执行很多的任务(子任务)

Executors.newWorkStealingPool():每个线程维护一个任务队列,如果某个队列执行完成,可以从其他队列中获取任务

RecursiveAction:不带返回值

RecursiveTask<T>: 带返回值

26.JMH

用于测试程序性能

27. Disruptor

Disruptor:分裂、瓦解;单线程每秒最多能处理600w任务;性能极高;CAS;单机支持高并发;底层是个环形数组

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/78252.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

力扣(LeetCode)142. 环形链表 II(C++)

哈希表 最直观的思想&#xff0c;哈希表记录遍历的结点&#xff0c;如果结点重复出现&#xff0c;则有环。如果遍历到空结点&#xff0c;无环。 class Solution { public:ListNode *detectCycle(ListNode *head) {unordered_set<ListNode *> ad;auto tail head;while(…

java计算机毕业设计ssm医患交流平台93xzr(附源码、数据库)

java计算机毕业设计ssm医患交流平台93xzr&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。…

用Excel自带图表插入带分类变量的箱形图(单坐标轴并列箱)

箱型图主要用来观察一个或多个类别下&#xff0c;数值型变量的分位数及离群值的特征和分布&#xff0c;以及在一定程度上观察到偏度和峰度的状态。网上有一些自己计算分位数来绘制箱型图的方法&#xff0c;但一方面是没有直接使用excel自带的箱型图好看和功能全面&#xff0c;二…

qq群聊机器人接入ChatGPT-简介和源码

qq群聊机器人接入ChatGPT 最近 ChatGPT 很火&#xff0c;也注册了账号玩了玩&#xff0c;确实灰常强大。但是也有的小伙伴可能没办法注册账号&#xff0c;我就想着把qq群机器人接入ChatGPT。 过程还是比较简单顺利的。下面简单介绍一下 直接跳过介绍&#xff0c;查项目代码 1…

绘制金字塔-第10届蓝桥杯Scratch选拔赛真题精选

[导读]&#xff1a;超平老师计划推出Scratch蓝桥杯真题解析100讲&#xff0c;这是超平老师解读Scratch蓝桥真题系列的第100讲。 蓝桥杯选拔赛每一届都要举行4~5次&#xff0c;和省赛、国赛相比&#xff0c;题目要简单不少&#xff0c;再加上篇幅有限&#xff0c;因此我精挑细选…

基于java(springboot)校园新闻管理系统源码(java毕业设计)

基于java(springboot)校园新闻管理系统 校园新闻管理系统是基于java编程语言&#xff0c;MySQL数据库&#xff0c;和springboot框架&#xff0c;用idea开发工具开发的设计&#xff0c;本设计分为学生用户&#xff0c;管理员两个角色&#xff0c; 学生的主要功能是可以注册登陆…

Cpolar实现虚拟机内网穿透,搭建私人云服务器

Cpolar实现虚拟机内网穿透,搭建私人云服务器 一、Cpolar功能介绍 Cpolar官网 Cpolar是一个安全的内网穿透的服务&#xff0c;可以将内网下的本地服务器通过安全隧道暴漏给公网。允许公网用户可以正常访问内网服务&#xff0c;是一款免费的内网穿透软件。只需要一行命令&#…

Python小炼(1):初识Python

"也许对我来说&#xff0c;太多拘束可能" 本篇的主要内容,针对的是一些常见的语法&#xff0c;在python中是怎样表示的&#xff0c;例如,python变量如何定义、选择、循环、判断结构是如何表示的&#xff1f;python函 数定义是怎么定义的…… ----前言 一、认识pyt…

无需代理及注册在VsCode中使用ChatGPT

无需代理及注册在VsCode中使用ChatGPT 安装 要安装扩展&#xff0c;请按照下列步骤操作&#xff1a; 1.打开 Visual Studio Code 2.单击左侧栏中的扩展程序图标 3.搜索"ChatGPT中文版" 4.点击安装按钮安装扩展 5.重启VSCode 用法 开始使用 在编辑器中右键触发…

【LeetCode每日一题:1691. 堆叠长方体的最大高度~~~排序+贪心】

题目描述 给你 n 个长方体 cuboids &#xff0c;其中第 i 个长方体的长宽高表示为 cuboids[i] [widthi, lengthi, heighti]&#xff08;下标从 0 开始&#xff09;。请你从 cuboids 选出一个 子集 &#xff0c;并将它们堆叠起来。 如果 widthi < widthj 且 lengthi < …

Java学习笔记6.3.3 文件操作 - 对象序列化与反序列化

文章目录零、本讲学习目标一、对象序列化与反序列化&#xff08;一&#xff09;对象序列化与反序列化概念&#xff08;二&#xff09;对象序列化与反序列化示意图&#xff08;三&#xff09;实际开发中序列化和反序列化的场景&#xff08;四&#xff09;实现对象序列化的两种方…

26岁,干了三年测试,月薪才12k,能跳槽找到一个更高薪资的工作吗?

在我们的身边&#xff0c;存在一个普遍现象&#xff1a;很多人从事软件测试岗&#xff0c;不计其数&#xff0c;经历的心酸难与外人道也。可是技术确难以提升、止步不前&#xff0c;薪资也只能看着别人水涨船高&#xff0c;自己却没有什么起色。 虽然在公司里属于不可缺少的一…

计算机网络:数据链路层

数据链路层 数据链路层主要处理单个链路上如何传输数据&#xff0c;并且向网络层向上提供服务 1. 数据链路层概述 1.1 术语介绍 主机拥有全部的计算机网络结构&#xff0c;路由器只有一部分 各个路由器之间由物理层连接 红线为发送的信息 1.2 数据链路层的三个重要问题 封装…

职业危机:从无到有,从弱到强;反思再反思和应对措施

一、写在开头 每天每周不写点东西&#xff0c;不把脑中的疑惑写明白&#xff0c;就感觉不到每天的进步。 每天没进步&#xff0c;这北漂生活&#xff0c;何时是个头啊。 可以北漂10年&#xff0c;也可以20年&#xff0c;但不可能是一辈子。 因为我不是北京人呐。 二、持续转…

Redis的字符串是怎么实现的

本篇会讲以下内容&#xff1a; Redis字符串的实现 Redis字符串的性能优势 Redis字符串的实现 Redis虽然是用C语言写的&#xff0c;但却没有直接用C语言的字符串&#xff0c;而是自己实现了一套字符串。目的就是为了提升速度&#xff0c;提升性能&#xff0c;可以看出Redis为…

Nacos的服务注册之客户端

服务注册到Nacos以后,会保存在一个本地注册表中,这个注册表是一个map. private Map<String, Map<String, Service>> serviceMap new ConcurrentHashMap<>(); key是namespace,用来隔离环境 value又是一个map      key是group      value又是一个s…

java计算机毕业设计springboot+vue远程教育系统

项目介绍 通篇文章的撰写基础是实际的应用需要,然后在架构系统之前全面复习大学所修习的相关知识以及网络提供的技术应用教程,以远程教育系统的实际应用需要出发,架构系统来改善现远程教育系统工作流程繁琐等问题。不仅如此以操作者的角度来说,该系统的架构能够对多媒体课程进…

以太网 DHCP(简介、DHCP工作原理、租期时间)

2.13.0 以太网 DHCP&#xff08;简介、DHCP工作原理、租期时间&#xff09; DHCP的作用&#xff1a;企业网络中存在大量的终端设备&#xff08;PC&#xff09;&#xff0c;管理员配置设备上网参数工作量大&#xff0c;而且效率不高&#xff0c;手动配置容易出错&#xff0c;DH…

数据库复杂sql如何编写入手

前言&#xff1a;说到数据库我想大家都不陌生&#xff0c;对主流的数据库都会基本使用&#xff0c;但是要写好sql完成复杂的sql编写是需要对数据库原理&#xff0c;sql脚本语法有一定的了解的&#xff0c;但是对于开发人员来说&#xff0c;平常都是在curd写一些业务代码&#x…

Flutter 中使用 OpenAI GPT-3 进行语义化处理

Flutter 中使用 OpenAI GPT-3 进行语义化处理 前言 最近 openai 的 ChatGPT 火了&#xff0c;然后我也想着用它来做点什么&#xff0c;于是就写了个 调用 openai api 语言执行工具&#xff0c;跑个测试&#xff0c;以后再有功能也可以在这个程序上面试验。 copilot 也是用的 op…