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
关注
打赏
热门博文
- 【Java】设计模式之单例模式与工厂模式
- 【Java面试宝典】线程安全问题|线程死锁的出现|线程安全的集合类
- 【Rust指南】错误的分类与传递|使用kind进行异常处理
- 【Servlet】规范项目结构|基于Mysql+JDBC+Servlet 制作简易网页|实现登录、添加、删除、显示的功能
- 【C语言】规范掌握C语言函数|数组名的妙用|指针快速入门|综合使用小案例
- 【Servlet】超详细开发步骤|在idea上配置Tomcat|网页显示当前系统时间
- 新学期,新FLAG | 要以码为梦而非夜郎自大
- 猿创征文 | 【Rust指南】枚举类与模式匹配精讲
- 牛客网《剑指offer》专栏刷题练习之二叉树合集
- 开学季&河科大社区活动详情介绍实例
