3、多线程

3、多线程

image-20231011234457479

3.1、线程基础知识

线程与进程的区别

image-20231011095213663

并行与并发的区别

单核CPU

image-20231011095539529

多核CPU

image-20231011095655382

形容

image-20231011095814733

总结

image-20231011095825576

创建线程的方式

image-20231011100503786

线程池创建线程代码,一般建议自定义线程池

image-20231011100517314

runnable和callable的区别(补充)

image-20231011100724497

run()和start()的区别(补充)

image-20231011100825106

线程中包含哪些状态

image-20231011224318905

总览

image-20231011230056922

阻塞的情况

image-20231011230139850

等待的情况

image-20231011230201296

总结

image-20231011230455116

如何让线程t1、t2 、t3按顺序执行

image-20231011230740640

notify() 和 notifyAll() 有什么区别

  • notify() :只随机唤醒一个wait线程
  • notifyAll() :唤醒所有的wait的线程

wait 和 sleep 方法有什么不同

wait释放锁,并且需要先拿到wait对象的锁。

sleep不释放锁

image-20231011231724280

如何停止一个正在运行的线程

image-20231011234031007

①添加退出标记,使线程正常退出,也就是run方法完成后线程终止

此处的volatile,可见性,是为了防止指令重排优化,把!flag 优化成 true。

image-20231011233132570

②使用stop方法强行终止(不推荐,已经废弃)

t.stop();

③使用interrupt中断线程

image-20231011234153283

image-20231011234237164

3.2、线程中并发安全

Synchronized的底层原理

image-20231012001356231

image-20231012003333867

总结回复,基础+进阶

基础总结

image-20231012003601231

进阶总结

image-20231012003908750

image-20231012005823103

四种锁的对象头中的markword的区别

image-20231012004352528

重量级锁

image-20231012004526906

轻量级锁

image-20231012005021477

image-20231012005145351

偏向锁

image-20231012005615524

image-20231012005607354

JMM内存模型

JMM(Java Memory Model) Java内存模型,定义了共享内存多线程程序读写操作的行为规范,通过这些规则来规范对内存的读写操作从而保证指令的正确性。

image-20231012192350922

面试题

image-20231012192433482

你了解CAS吗

保证了无锁情况下的原子性

下图是cas的数据交换过程

总共有三个变量。 把B的结果赋值给V的时候,要拿A对比V,相等,才可以把V重新赋值成B,否则就开始自旋。

V 表示原主内存共享变量

A表示某个线程单独的工作内存中的一个原变量

B表示A要修改后的结果。

image-20231013010439000

面试回答

image-20231013003409021

谈谈你对volatile的理解

告诉JIT,volatile罩着的变量不许去优化。以保证线程间的共享变量的可见性。

image-20231013004132807

禁止指令重排序

image-20231013004954729

面试回答

image-20231013005145848

什么是AQS

全称是 AbstractQueuedSynchronizer ,即抽象队列同步器。它是构建锁或者其他同步组件的基础框架

image-20231013005714454

AQS基本工作机制,当一个线程抢到资源了就把state的状态修改为1有锁,然后后续有线程来了,就会去fifo队列中排队等待,直到state为0的时候,就唤醒fifo的第一个元素,也就是第一个线程。

image-20231013010043353

多个线程同时竞争的时候,用的是CAS保证原子性的。

image-20231013010837454

AQS对公平锁和非公平锁都能实现。

image-20231013011036685

面试回答

image-20231013011154712

ReentrantLock的实现原理

image-20231013011417993

image-20231013011705748

面试回答

image-20231013012009544

Synchronized和Lock有什么区别

语法层面

image-20231013012303139

功能层面

image-20231013012522415

下面部分代码提供多条件变量的示例

image-20231013014640407

image-20231013014742832

image-20231013014720551

性能层面

image-20231013014856355

死锁产生的条件是什么

image-20231013015206036

诊断死锁

image-20231013022902104

image-20231013023107708

面试回答

image-20231013023133091

聊一下ConcurrentHashMap

image-20231013023509345

image-20231013023845843

image-20231013023833196

面试回答

image-20231013024055248

出现并发安全问题的原因

Java并发程序有三大特征:

①原子性:

image-20231013025250758

②可见性:

image-20231013025219466

③有序性:

image-20231013025357437

面试问题

image-20231013025411395

3.3、线程池

线程池的核心参数

任务排队排到一定长度,就去创建救急线程外包来处理(外包和正式工干活没有任何区别),正式工不会被开除,但是外包一定时间空闲是要被开除(释放)的;

keepAliveTime是救急线程生存时间不要误会为减去救急线程生存时间

workQueue是阻塞队列

image-20231013030327358

线程池的执行原理

image-20231013031149193

代码示例

image-20231013032833022

线程中有哪些常见的阻塞队列

我们在项目中选LinkedBlockingQueue,因为有俩把锁一个头锁一个尾锁,比如ArrayBlockingQueue一把锁的效率要高

image-20231013040701197

image-20231013033729522

如何确定核心线程数

image-20231013034550277

面试回答

ps:通常Java开发的项目是io密集型项目,很少有CPU密集型的项目

image-20231013035123043

线程池的种类有哪些

1、newFixedThreadPool(固定线程数)

image-20231013035602303

2、newSingleThreadExecutor(单线程线程池)

image-20231013035914850

3、newCachedThreadPool(全是外包线程)

image-20231013040057566

4、ScheduledThreadPoolExecutor(延迟线程)

image-20231013040445565

面试问题

image-20231013040618287

为什么不建议用Executors创建线程池

image-20231013040942096

3.4、使用场景

image-20231014014106164

CountDownLatch、Future

T1线程调用了CountDownLatch的await()等待,必须等count变成0才可以让T1继续执行

T2、T3、T4 分别调用了CountDownLatch的countDown()方法,把count计数减到0,T1就可以继续执行

image-20231013041416920

从DB中导入50w数据到ES

image-20231013132635364

数据汇总

image-20231013135858621

image-20231013135816743

异步调用

image-20231014014008841

如何控制线程的访问数量

image-20231014014650243

image-20231014014632561

你了解ThreadLocal吗

image-20231014015945163

image-20231014020010418

set方法

image-20231014015746503

get/remove方法

image-20231014015902236

ThreadLocal内存泄露问题

image-20231014020850263

image-20231014034458992

面试问题

image-20231014034823828


3、多线程
http://101.126.22.188:9090//2024/06/30/1697308598656
作者
不是王总
发布于
2024年06月30日
更新于
2024年06月30日
许可协议