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

posted @   刘百会  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示