• 备战秋招--多线程


    多线程

    35、并行和并发有什么区别?

    并行是不同实体两个或两个以上的线程在同一时刻发生;并发是同一实体上两个或两个以上线程在同一时间间隔发生。

    36、线程和进程的区别?

    进程是程序执行和资源分配的基本单位,一个程序至少有一个进程,一个进程至少有一个线程;线程是进程的一个实体,线程是cpu执行和分配的基本单位,线程是程序还小的可独立运行的基本单位,在同一个进程中多个线程可以并发执行。

    37、守护线程是什么?

    守护线程就是服务线程,说白了就是服务其他线程的。

    38、创建线程有哪几种方式?

    继承thread类,重写重写run方法,然后用实现类的对象调用start方法启动线程;实现runable接口,重写run方法,然后将实现类的对象当做thread类的target来创建线程对象,线程对象调用start方法启动线程。实现collable接口,重写call方法,用futuretask对象来包装实现类对象,将包装后的对象当做thread类的target对象创建线程对象,在用新创建的线程对象调用start方法来启动线程,其中线程的返回值可以用未来对象的get方法获取。

    39、说一下runnable和callable有什么区别?

    runnable创建线程的方式是:实现runnable接口,重写run方法,将此实现类的对象当做thread类的target对象以此来创建出线程对象,在通过线程对象的start方法启动线程。callable创建线程的方式是:实现callable接口,用futuretast来包装实现类对象,将包装后的对象当做thread类的target来创建线程对象,在用线程对象调用start方法启动线程,其中可以用未来对象调用它的get方法获取线程的返回值。

    40、线程有哪些状态?

    创建、就绪、运行、阻塞、死亡。
    在这里插入图片描述
    创建:就是你在创建线程对象,但是还没有调用start时的状态。

    就绪:线程对象调用了start方法,但是线程调度没有将该线程设为当前线程,就进入就绪状态。

    运行:就绪状态的线程得到资源调度设成了当前线程,进入运行状态,执行线程体中的内容。

    阻塞:运行状态由于等待某种资源的而进入的一种等待状态,解除这种状态后进入就绪状态。

    死亡:就是线程执行完成了,则进入死亡状态。

    41、sleep()和wait()有什么区别?

    sleep()是让线程进入睡眠状态,睡眠状态解除后,线程会进入到就绪状态,其中在睡眠状态的时候,线程中的对象不会释放锁,直到将锁中内容运行完后才会释放锁;wait()是让线程进入等待状态,首先线程是进入该对象的等待池中,如果被notify唤醒后进入锁池中竞争锁,得到锁后进入就绪状态等待线程调度。

    42、notify()和notifyAll()有什么区别?

    notify是唤醒对象池中的某个对象,而notifyAll是唤醒对象池中的所有对象进入锁池竞争锁。

    43、线程的run()和start()有什么区别?

    start()是用来启动一个线程的,而run()是线程的执行体,里面有线程要执行的内容,但是执行里面内容没执行完还可以执行其他的线程。

    44、创建线程池有哪几种方式?

    固定长度的线程池、有缓存的线程池、单线程的线程池、有定时的线程池。

    new fixedthreadpool:线程数量固定。

    new cachedthreadpool:线程池里的线程数量可以改变,并且会根据情况清楚无用线程。

    new threadpoolexecuater:这是一个单线程,会按照任务队列中顺序依次执行任务,如果出现以外会创建一个新的线程继续执行任务。

    new scheduledthreadpool:可以执行定时任务的线程池。

    45、线程池都有哪些状态?

    running、shoutdown、stop、tyding、terminated。
    在这里插入图片描述
    running:线程池的初始状态,可以正常接收和执行任务。

    shoutdown:改状态下不可接收任务,但是可以执行线程池中已有的任务。

    shoutdownnow:该状态下不可接收任务,不可执行任务。

    tyding:当执行了shoutdown()线程池中的任务为0时进入该状态,此时会执行钩子函数terminated()。

    terminated:钩子函数执行完后进入该状态,代表线程池已结束。

    46、线程池中的submit()和execute()有什么区别?

    都是提交一个线程给线程池,但是submit有返回值。

    47、在java程序中怎么保证多线程的运行安全?

    原子性:一个数据同一时刻只能有一个线程访问。

    可见性:一个线程对内存结构的改变另一个线程也可看到

    顺序性:跟线程的执行顺序有关,问你的话就不太懂这个就行。

    48、多线程锁的升级原理是什么?

    无锁==》偏向锁==》轻量级锁===》重量级锁

    49、什么是死锁?

    多个进程之间互相请求资源或者彼此通信造成的一种阻塞状态,称为死锁。

    50、怎么防止死锁?

    从死锁产生的四个条件入手:互斥条件、请求和保持条件、不可剥夺条件、环路等待条件。

    互斥条件:一个进程所持有的资源,另一个进程不可访问。

    请求和保持条件:一个进程请求另一个进程的资源时由于互斥条件的存在,改进程只能等待另一个进程释放资源,但是等待过程中不会释放自己所持有的资源。

    不可剥夺条件:一个进程一旦持有某个资源就不能被剥夺,除非他自己释放该资源。

    环路等待条件:在死锁的状态下多个进程等待彼此的资源而形成的一种环路现象。

    预防死锁可以从这四个方面在设计操作系统的时候预防。

    51、ThreadLocal是什么?有哪些使用场景?

    threadlocal是线程的局部变量,只在当前线程有效,资源不共享。是一种实现线程安全的方式。尽量不要用在web应用中,否则会造成内存泄漏。

    52、说一下synchronized底层实现原理?

    synchronized在代码块和方法运行时,保证同一时间只有一个方法进入临界区,同时还保证了共享变量的内存可见性。

    53、synchronized 和 volatile 的区别是什么?

    不用记,问到了就说不会。

    54、synchronized 和 Lock 有什么区别?

    synchronized 自动释放锁,lock需要自己在trycatch finally的finally中用unlock方法手动释放锁;synchronized 是java的关键字,lock是java的类;lock可以获取锁的信息,synchronized 无法获得;synchronized 获取不到锁会持续等待,lock持续获取不到锁会结束线程。

    55、synchronized 和 ReentrantLock 区别是什么?

    不用背,问了就说不会。

    56、说一下 atomic 的原理?

    ronized 获取不到锁会持续等待,lock持续获取不到锁会结束线程。

    55、synchronized 和 ReentrantLock 区别是什么?

    不用背,问了就说不会。

    56、说一下 atomic 的原理?

    不用背,问了就说不会。

    补:1、synchronized的几种使用方法
    同步代码块:synchronized(this),让当前对象作为锁,也就是同一时间只有一个线程可访问
    同步方法:在方法上加synchronized修饰,让当前方法所对应的实例作为锁,如果多个线程都有实例,谁先获得的实例谁就拥有锁
    同步静态方法或者类:同样是把静态方法或类用synchronized修饰,每个线程都有可能获得一个类实例,但是谁先获得类实例谁就拥有锁,谁就可以先访问。

  • 相关阅读:
    很迷茫要不要学习次世代建模,看完这8个要点,豁然开朗
    每周一篇论文-规划算法Jump Point Search-Online Graph Pruning for Pathfinding on Grid Maps
    2022年最新江西建筑施工物料提升(建筑特种作业)模拟题库及答案
    LeetCode二叉树系列——110.平衡二叉树
    UE4 Http协议实现Web登陆与注册
    HSRP热备份路由器协议的解析和配置
    微软秋招内推八月截止,快来找我内推!
    FFmpeg 命令:从入门到精通 | ffplay 简单过滤器
    代码重构:面向单元测试
    Leetcode140-单词拆分 II
  • 原文地址:https://blog.csdn.net/weixin_51930617/article/details/126868824