- 现代操作系统调度的最小的单元是线程,也叫轻量级进程,一个进程里可以创建多个线程
- 为什么要使用多线程
- 更多的处理器核心:一个线程在一个时刻只能运行在一个处理器核心上,多线程技术能将计算逻辑分配到多个处理器和欣赏,显著减少程序的处理时间
- 更快的响应时间:将数据一致性不强的操作派发给其他线程处理,缩短了响应时间,提升了用户体验
- 更好的编程模型:Java为多线程编程提供了良好、考究并且一致的编程模型
- 现代操作系统基本采用时分的形式调度运行的线程,操作系统会分出一个个时间片,线程会分配到若干时间片,当线程的时间片用完了就会发生线程等待,并等待下次分配。
- Java的线程状态:
- NEW(初始状态)
- RUNNABLE(运行状态,就绪和运行统称为“运行中”)
- BLOCKED(阻塞)
- WAITING(等待)
- TIME_WAITING(超时等待)
- TERMINATED(终止状态)
- 线程在自身的生命周期中,并不是固定的处于某个状态,而是随着代码的执行在不同的状态之间进行切换
- 程序在执行过程中,一个线程看到的变量并不一定是最新的
- 过多的使用volatile是不必要的,会降低程序执行的效率
- synchronized主要确保多个线程在同一时刻,只能有一个线程处于方法或同步块中,保证了线程对变量访问的可见性和排他性
- 等待/通知机制
- 一个线程修改了一个对象的值,而另一个线程感知到了变化,然后进行相应的操作,整个过程开始于一个线程,而最终执行又是另一个线程。
- 生产者与消费者,这种模式隔离了“做什么”和“怎么做”,功能层面上实现了解耦
- 简单的实现是让消费者线程不断地循环检查变量是否符合预期,在while循环中设置不满足的条件,满足条件则退出循环从而完成消费者工作
- 难以确保及时性
- 难以降低开销
- 相关方法
- notify()
- notifyAll()
- wait(),调用后会释放对象的锁
- wait(Long)
- wait(Long,int)
- 等待通知机制是指一个线程A调用了对象O的wait()方法进入等待状态,另一个线程B调用了O的notify()或者notifyAll()方法,线程A收到通知后从对象O的wait()方法返回,进而执行后续操作。
- Thread.join(),当前运行的线程A等待指定的thread线程终止之后才从thread.join()返回。
- 等待/通知经典范式:加锁、循环、处理逻辑
- ThreadLocal,即线程变量,是一个以ThreadLocal对象为键、任意对象为值的存储结构。这个结构被附带在线程上,一个线程可以根据一个ThreadLocal对象查询到绑定在这个线程上的一个值。
- 等待超时模式:在等待/通知范式基础上增加了超时控制,wait(Long)精髓
- 线程池的本质就是使用了一个线程安全的工作队列连接工作者线程和客户端线程,客户端线程将任务放入工作队列后便返回,而工作者线程则不断的从工作队列上取出工作并执行。当工作队列为空时,所有的工作者线程均等待在工作队列上,当有客户端提交了任务会通知任意一个工作者线程。
-
# 留言:老婆做了一个小红书账号,全是瓷砖方面的干货,大佬们如果有需求或者有兴趣可以移步了解一下,嘻嘻~
并发编程基础 概念笔记整理-Java并发编程的艺术 第四章笔记整理
于 2022-07-25 15:59:27 首次发布