CSDN话题挑战赛第2期 参赛话题:面试宝典
文章目录
前言
- 前言
- 1、多线程概述
- 1.1、线程的由来
- 1.2、多线程特点
- 2、线程安全问题
- 2.1、互斥锁
- 2.1.1、同步代码块
- 2.1.2、同步方法
- 2.2.3、两种同步思路的区别
- 2.2、死锁
- 2.2.1、线程通信
- 2.2.2、sleep和wait的区别?
- 3、线程安全的集合类
线程安全在面试中是考官比较青睐的考点,那我就从多线程的组成特点上开始,分析线程安全问题、死锁出现与解决的方法以及线程安全的集合类总结。希望可以帮助大家理清有关知识点,直面考官,收割offer!
1、多线程概述 1.1、线程的由来概念
线程是进程中并发执行的多个任务,进程是操作系统中并发执行的多个程序任务。
进程具有宏观并行,微观串行的特点:
- 原理: 在同一时间段内,CPU会将该时间段划分为很多个时间片,时间片之间交替执行,一个时间片只能被一个进程拥有,只有拿到时间片的程序才能执行自身内容,当时间片的划分足够细小,交替频率足够快,就会形成宏观并行的假象,本质仍然是串行。
- 注意: 只有正在执行的程序才能叫进程。
只存在多线程,不存在多进程
- 线程是进程的基本组成部分
- 宏观并行,微观串行
- 原理: 一个"时间片"只能被一个进程拥有,一个进程一次只能执行一个线程
- 线程的组成:
- 时间片
- 由
OS
进行调度分配,是线程执行的因素之一
- 由
- 数据
- 栈:每个线程都有自己独立的栈空间(栈独立)
- 堆:堆空间被所有线程共享(堆共享)
- 代码
- 特指书写逻辑的代码
- 时间片
当多个线程同时访问同一临界资源时,有可能破坏其原子操作,从而导致数据缺失。
- 临界资源:被多个线程同时访问的对象
- 原子操作:线程在访问临界资源的过程中,固定不可变的操作步骤
每个对象都默认拥有互斥锁,开启互斥锁之后,线程必须同时拥有时间片和锁标记才能执行,其他线程只能等待拥有资源的线程执行结束释放时间片和锁标记之后,才有资格继续争夺时间片和锁标记。
利用synchronized
开启互斥锁,使线程同步,可以采取两种方法:
- 同步代码块
- 同步方法
思路:谁访问临界资源,谁对其加锁
synchronized(临界资源对象){
//对临界资源对象的访问操作
}
示例:
public class Test {
public static void main(String[] args) throws Exception {
//myList 是自定义的集合类,封装了添加与遍历集合的方法
MyList m = new MyList();
//线程1:往集合中添加1-5
Thread t1=new Thread(new Runnable() {
@Override
public void run() {
for (int i=1;i
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?