java多线程学习
java多线程学习
多线程啥时候执行的
乐观锁和悲观锁:
悲观锁:synchronized和lock、使用场景一般是写操作。
synchronized锁方法的时候,某个时刻锁的是类,其他方法需要等别的锁释放才能使用。静态同步方法是类锁。
字节码查看:javap -c或者 javap -v
public void m1(){ synchronized (object){ System.out.println("nihao"); } } public synchronized void m2(){ System.out.println("nihao"); } public static synchronized void m3(){ System.out.println("nihao"); }
乐观锁:版本号或者是cas算法,读操作场景。
公平锁和非公平锁:
非公平锁:reentrantlock()、设置为true就是公平锁reentrantlock(true)
死锁:资源不足、获取锁的顺序不对、
排查死锁:
或者是jconsule图形化
中断线程:
interrupt(),协商中断,不会立即停止
synchronize中使用wait(),lock使用await()
lockSuport等待和唤醒
park()、unpark()、不需要先等待在唤醒。
自身自带锁。
jmm学习:内存模型
网络、磁盘、内存、缓存、cpu
原子性、可见性、有序性
happens-before原则
volatile:
可见性、有序
刷新到主内存、禁止指令重排。不能保证原子性。
内存屏障
volalite修饰共享变量
缓存一致性
CAS学习
比较并交换
unsafe类具体实现
原子引用类:AtomicReference<User>
问题:循环开销过大、引发aba问题,通过版本号解决
原子操作类:
基本类型原子类
数值类型原子类
引用类型原子类
不使用锁,通过使用原子类保证线程安全问题
原子增强类:
longAdder性能高
threadLocal
问题:容易造成内存泄露。
thread----threadlocal----threadlocamap
threadlocal是弱引用、回收之后,threadlocalmap的key就是null,value就回收不了,内存泄露了。手动使用remove删除
源码分析:remove是把key等于null的,把value也置位null。
对象实例构成:
对象头、(markword、类型指针)实例数据、对齐填充。
markword占16字节
java15之后偏向锁移除掉了00
重量级锁10,有大量的线程参与竞争
锁消除
锁粗化
AQS
state状态、队列
读写锁
读读可以共享
邮撮锁
completableFuture学习
多线程、有返回、异步执行。
futuretask类---get()返回结果,会堵塞
completableFuture对于异步任务,多个阶段,按阶段完成。
runasync():无返回值的
supplyAsync()有返回值的
线程池:
参数说明:最大线程数、核心线程数、keepalivetime线程回收时间、workqueue任务、拒绝策略、threadfactory线程工厂。
执行过程:
为啥使用阻塞队列?
线程进入wait状态,阻塞线程。
为啥先放到阻塞队列而不是创建新线程,因为创建线程需要全局锁,效率低。
线程状态:新建,就绪,运行,等待,超时等待,停止。
参考学习:https://www.bilibili.com/video/BV1ar4y1x727?p=56&spm_id_from=pageDriver
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?