没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
试读
31页
资源概要:1,多线程;2,synchronized;3,volatile;4,多线程在JVM中的实现原理剖析 导语: 什么是多线程? 多线程(multithreading)是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。 并发编程:编写多线程代码,解决多线程带来的问题 为什么要学并发编程? 首先,来看一个案例:手写网站服务器案例。 高性能应用程序的一把钥匙,应用程序的翅膀,面试高频的考点 中间件几乎都是多线程应用:MySQL、ES、Redis,Tomcat,Druid,HikariCP... 怎么学并发编程? 多线程核心知识(概念、线程状态、线程安全问题、三大特性) 同步代码块Synchronized及其实现原理 volatile关键字及其实现原理 多线程在JVM中的实现原理 JUC概述 原子类Atomic-CAS及其实现原理 锁Lock-AQS核心原理剖析 并发工具类、并发容器、阻塞队列 线程池原理剖析 线程池案例-Web容器-压力测试
资源推荐
资源详情
资源评论
一、多线程
什么是多线程?
多线程(multithreading)是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力
的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。
并发编程:编写多线程代码,解决多线程带来的问题
为什么要学并发编程?
首先,来看一个案例:手写网站服务器案例。
高性能应用程序的一把钥匙,应用程序的翅膀,面试高频的考点
中间件几乎都是多线程应用:MySQL、ES、Redis,Tomcat,Druid,HikariCP...
怎么学并发编程?
多线程核心知识(概念、线程状态、线程安全问题、三大特性)
同步代码块Synchronized及其实现原理
volatile关键字及其实现原理
多线程在JVM中的实现原理
JUC概述
原子类Atomic-CAS及其实现原理
锁Lock-AQS核心原理剖析
并发工具类、并发容器、阻塞队列
线程池原理剖析
线程池案例-Web容器-压力测试
1. 多线程相关概念
1.1 线程和进程
进程:是指内存中运行的一个应用程序,每个进程都有自己独立的内存空间;进程也是程序的一次
执行过程,是系统运行程序的基本单位;系统运行一个程序即是一个进程从创建、运行到消亡的过
程。
线程:是进程中的一个执行单元,负责当前进程中任务的执行。一个进程在其执行过程中,会产生
很多个线程。
进程与线程区别:
进程:有独立内存空间,每个进程中的数据空间都是独立的。
线程:多线程之间堆空间与方法区是共享的,但每个线程的栈空间、程序计数器是独立的,线程消
耗的资源比进程小的多。
1.1.1 什么是并发与并行?
并发(Concurrent):同一时间段,多个任务都在执行 ,单位时间内不⼀定同时执行。
并行(Parallel):单位时间内,多个任务同时执行,单位时间内一定是同时执行。并行上限取决
于CPU核数(CPU时间片内50ms)
1.1.2 什么是线程上下文切换?
现在计算机一般都是多核CPU,且OS都能够同时支持远大于CPU内核数的线程运行。那么,OS如何分配
CPU资源与调度线程呢?
以我的个人计算机为例:4核8线程
一个CPU内核,同一时刻只能被一个线程使用。为了提升CPU利用率,CPU采用了时间片算法将CPU时
间片轮流分配给多个线程,每个线程分配了一个时间片(几十毫秒/线程),线程在时间片内,使用CPU
执行任务。当时间片用完后,线程会被挂起,然后把 CPU 让给其它线程。
那么问题来了,线程再次运行时,系统是怎么知道线程之前运行到哪里了呢?
CPU切换前会把当前任务状态保存下来,用于下次切换回任务时再次加载。
任务状态的保存及再加载的过程就叫做上下文切换。
任务状态信息保存在哪里呢?
程序计数器:用来存储CPU正在执行的指令的位置,和即将执行的下一条指令的位置。
他们都是CPU在运行任何任务前,必须依赖的环境,被叫做CPU上下文。
上下文切换过程:
1. 挂起当前任务任务,将这个任务在 CPU 中的状态(上下文)存储于内存中的某处。
2. 恢复一个任务,在内存中检索下一个任务的上下文并将在 CPU 的寄存器中恢复。
3. 跳转到程序计数器所指定的位置(即跳转到任务被中断时的代码行)。
线程上下文切换会有什么问题呢?
过多的线程并行执行会导致CPU资源的争抢,产生频繁的上下文切换,常常表现为高并发执行时,RT延
长。因此,合理控制上下文切换次数,可以提高多线程应用的运行效率。(也就是说线程并不是越多越
好,要合理的控制线程的数量。)
直接消耗:指的是CPU寄存器需要保存和加载,系统调度器的代码需要执行
间接消耗:指的是多核的cache之间得共享数据,间接消耗对于程序的影响要看线程工作区操作数
据的大小
1.2.3 线程状态:一个线程的一生
查看Thread源码,能够看到java的线程有六种状态:
public enum State {
NEW,
RUNNABLE,
BLOCKED,
WAITING,
TIMED_WAITING,
TERMINATED;
}
1
2
3
4
5
6
7
8
NEW(新建) 线程刚被创建,但是并未启动。
RUNNABLE(可运行) 线程可以在java虚拟机中运行的状态,可能正在运行自己代码,也可能没有,这取决
于操作系统处理器。
BLOCKED(锁阻塞) 当一个线程试图获取一个对象锁,而该对象锁被其他的线程持有,则该线程进入
Blocked状态;当该线程持有锁时,该线程将变成Runnable状态。
WAITING(无限等待) 一个线程在等待另一个线程执行一个(唤醒)动作时,该线程进入Waiting状态。进
入这个状态后是不能自动唤醒的,必须等待另一个线程调用notify或者notifyAll方法才能够唤醒。
TIMED_WAITING(计时等待) 同waiting状态,有几个方法有超时参数,调用他们将进入Timed
Waiting状态。这一状态将一直保持到超时期满或者接收到唤醒通知。带有超时参数的常用方法有
Thread.sleep 、Object.wait。
TERMINATED(被终止) 因为run方法正常退出而死亡,或者因为没有捕获的异常终止了run方法而死亡。
线程状态图:
常用属性:
线程名称
线程ID:ThreadID = tid
线程优先级:Priority
常用方法:
线程让步:yield()
让线程休眠的方法:sleep()
等待线程执行终止的方法: join()
线程中断interrupt()
等待与通知系列函数wait()、notify()、notifyAll()
wait()与sleep()区别:
主要区别:sleep()方法没有释放锁,而wait()方法释放了锁
两者都可以暂停线程的执行
wait()通常用于线程间的交互/通信,sleep()通常用于暂停线程执行
wait()方法被调用后,线程不会自动苏醒,需要别的线程调用同一个对象的notify或notifyAll。
sleep()方法执行完成后,线程会自动苏醒。或者可以使用wait(long)超时后,线程也会自动苏醒
1.2 线程安全问题(核心问题)
什么是线程安全?
如果有多个线程在同时执行,而多个线程可能会同时运行一行代码。如果程序每次运行结果和单线程运
行的结果一样,且其他的变量的值也和预期一样,就是线程安全的,反之则是线程不安全的。
举个栗子:
1.2.1 经典案例:卖票
假设电影院要播放的电影是 “独行月球”,电影院要卖电影票,我们采用多线程程序模拟电影院卖票过
程。一场电影的座位共100个,每个座位一张票。公有三个电影票售票窗口。要求实现多个窗口同时卖
“独行月球”这场电影票。卖完为止,不可多卖也不可以有余票。
代码实现:
package com.hero.multithreading;
public class Demo01Ticket {
public static void main(String[] args) {
//创建线程任务对象
SellTicketTask task = new SellTicketTask();
//创建三个窗口对象
Thread t1 = new Thread(task, "窗口1");
Thread t2 = new Thread(task, "窗口2");
Thread t3 = new Thread(task, "窗口3");
//同时卖票
t1.start();
t2.start();
t3.start();
}
}
class SellTicketTask implements Runnable {
//电影票100张
private int tickets = 100;
/*
* 每个窗口执行相同的卖票操作
* 窗口永远开启,所有窗口卖完100张票为止
*/
@Override
public void run() {
while (true) {
//有票 可以卖
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
剩余30页未读,继续阅读
资源评论
小小哭包
- 粉丝: 1899
- 资源: 3854
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功