您当前的位置: 首页 >  Java

微凉秋意

暂无认证

  • 3浏览

    0关注

    110博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【Java面试宝典】线程安全问题|线程死锁的出现|线程安全的集合类

微凉秋意 发布时间:2022-09-29 18:55:24 ,浏览量:3

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会将该时间段划分为很多个时间片,时间片之间交替执行,一个时间片只能被一个进程拥有,只有拿到时间片的程序才能执行自身内容,当时间片的划分足够细小,交替频率足够快,就会形成宏观并行的假象,本质仍然是串行。
  • 注意: 只有正在执行的程序才能叫进程。
1.2、多线程特点

只存在多线程,不存在多进程

  • 线程是进程的基本组成部分
  • 宏观并行,微观串行
    • 原理: 一个"时间片"只能被一个进程拥有,一个进程一次只能执行一个线程
  • 线程的组成:
    1. 时间片
      • OS进行调度分配,是线程执行的因素之一
    2. 数据
      • 栈:每个线程都有自己独立的栈空间(栈独立)
      • 堆:堆空间被所有线程共享(堆共享)
    3. 代码
      • 特指书写逻辑的代码
2、线程安全问题

当多个线程同时访问同一临界资源时,有可能破坏其原子操作,从而导致数据缺失。

  • 临界资源:被多个线程同时访问的对象
  • 原子操作:线程在访问临界资源的过程中,固定不可变的操作步骤
2.1、互斥锁

每个对象都默认拥有互斥锁,开启互斥锁之后,线程必须同时拥有时间片和锁标记才能执行,其他线程只能等待拥有资源的线程执行结束释放时间片和锁标记之后,才有资格继续争夺时间片和锁标记。

利用synchronized开启互斥锁,使线程同步,可以采取两种方法:

  1. 同步代码块
  2. 同步方法
2.1.1、同步代码块

思路:谁访问临界资源,谁对其加锁

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            
关注
打赏
1664596500
查看更多评论
0.2094s