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
                    
                
                
            
        
浙公网安备 33010602011771号