【面试题】Java并发篇-10道常见面试题p1

注意:如果本文中有错误的地方,欢迎评论区指正!🍭

往期链接:

🧭【面试题】计算机网络篇-10道常见面试题p1

【面试题】JVM篇-10道常见面试题p1

1.说一下并发和并行的区别?


并发:同一时间段,多个任务都在执行 (单位时间内不一定同时执行)

并行: 单位时间内,多个任务同时执行

打个比方:

  • 并发(concurrent)是同一时间应对(dealing with)多件事情的能力
  • 并行(parallel)是同一时间动手做(doing)多件事情的能力。

详细内容可以参考:【并发编程】(学习笔记一进程与线程)-part1

2.什么是线程?什么是进程?


  • 进程:是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。

  • 线程:与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中可以产生多个线程。在java中,线程作为最小调度单位,进程作为资源分配的最小单位

👨‍💻面试官追问:线程和进程区别是什么?

  • 线程是进程划分成的更小的运行单位。
  • 线程和进程最大的不同在于基本上各进程是独立的而各线程则不一定,因为同一进程中的线程极有可能会相互影响。
  • 线程更轻量,线程上下文切换成本一般比进程上下文切换低。线程也被称为轻量级进程
  • 进程间通信较为复杂。线程通信相对简单,因为它们共享进程内的内存。一个例子是多个线程可以访问同一个共享变量。
*   同一台计算机的进程通信称为IPC(Inter-process communication).
*   不同计算机之间的进程通信,需要通过网络,并遵守共同的协议,如HTTP。

3.说一下你对守护线程的了解?


守护线程:即Daemon线程是一种支持型线程,因为它主要被用作程序中后台调度以及支持性工作。这意味着,当一个Java虚拟机中不存在非Daemon线程的时候,Java虚拟机将会退出。可以通过调用Thread.setDaemon(true)将线程设置为Daemon线程。

👨‍💻面试官追问:Daemon线程的使用有什么需要注意的吗?

  • Daemon属性需要在启动线程之前设置,不能在启动线程之后设置。
  • 在构建Daemon线程时,不能依靠finally块中的内容来确保执行关闭或清理资源的逻辑。

4.使用多线程可能带来什么问题?


在进行并发编程时,如果希望通过多线程执行任务让程序运行得更快,会面临非常多的挑战,比如:

  • 上下文切换的问题:频繁的上下文切换会影响多线程的执行速度。

  • 死锁的问题

  • 受限于硬件和软件的资源限制问题:在进行并发编程时,程序的执行速度受限于计算机的硬件或软件资源。

👨‍💻面试官追问:如何减少上下文切换呢?

  • 无锁并发编程:多线程竞争锁时,会引起上下文切换,所以多线程处理数据时,可以用一些办法来避免使用锁,如将数据的ID按照Hash算法取模分段,不同的线程处理不同段的数据。
  • CAS算法:Java的Atomic包使用CAS算法来更新数据,而不需要加锁
  • 使用最少线程避免创建不需要的线程,比如任务很少,但是创建了很多线程来处理,这样会造成大量线程都处于等待状态。
  • 协程:在单线程里实现多任务的调度,并在单线程里维持多个任务间的切换。

👨‍💻面试官继续追问:既然你提到了锁,那么死锁产生的必要条件是什么?

一共四个条件:

  • 互斥条件:该资源任意一个时刻只由一个线程占用。
  • 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
  • 不剥夺条件:线程已获得的资源在未使用完之前不能被其他线程强行剥夺,只有自己使用完毕后才释放资源。
  • 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

👨‍💻面试官继续逼问:那你说说Java多线程避免死锁有什么办法?

  • 避免一个线程同时获取多个锁
  • 避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源。
  • 尝试使用定时锁,使用lock.tryLock(timeout)来替代使用内部锁机制。
  • 对于数据库锁,加锁和解锁必须在一个数据库连接里,否则会出现解锁失败的情况。

👨‍💻面试官叒问:说了这么多,你用现在写一个Java死锁的案例?

可以的:

public class demo1Main1 {

private static String A = "A";
private static String B = "B";
public static void main(String[] args) {
    new demo1Main1().deadLock();
}
private void deadLock() {
    Thread t1 = new Thread(() -> {
        synchronized (A) {
            try {
                Thread.currentThread().sleep(2000);//属于线程 Thread 的方法,让线程暂缓执行,等待预计时间之后再恢复,交出CPU使用权,不会释放锁。这里是为了防止t1对A和B全部加锁了,t2还没有对B加锁。让执行顺序保证为t1->A,t2->B...
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized (B) {
                System.out.println("1");
            }
        }
    });
    Thread t2 = new Thread(() -> {
        synchronized (B) {
            synchronized (A) {
                System.out.println("2");
            }
        }
    });
    t1.start();
    t2.start();
}

}

5.说说线程的生命周期和状态?


Java线程在运行的生命周期中可能处于6种状态,在给定的一个时刻,线程处于其中一个状态。

  • NEW初始状态,线程被构建,但是还没有调用start()方法

  • RUNNABLE运行状态Java线程将操作系统中的就绪和运行两种状态笼统地称作“运行中”

  • BLOCKED阻塞状态,表示线程阻塞于锁

  • WAITING等待状态,表示线程进人等待状态,进入该状态表示当前线程需要等待其他线程做出一些特定动作(通知或中断)

  • TIMEWAITING超时等待状态,该状态不同于WAITING,它是可以在指定的时间自行返回的

  • TERMINATED终止状态,表示当前线程已经执行完毕

线程在生命周期中并不是固定处于某一个状态而是随着代码的执行在不同状态之间切换。

图片

一个完整的过程可以这样来看:

  1. 线程创建之后它将处于 NEW(新建) 状态,调用 start() 方法后开始运行,线程这时候处于 READY(就绪) 状态。可运行状态的线程获得了 CPU 时间片(timeslice)后就处于 RUNNING(运行) 状态。

  2. 当线程执行 wait()方法之后,线程进入 WAITING(等待) 状态。进入等待状态的线程需要依靠其他线程的通知才能够返回到运行状态,而 TIMED_WAITING(超时等待) 状态相当于在等待状态的基础上增加了超时限制,比如通过 sleep(long millis)方法或 wait(long millis)方法可以将 Java 线程置于 TIMED_WAITING 状态。

  3. 当超时时间到达后 Java 线程将会返回到 RUNNABLE 状态。

  4. 当线程调用同步方法时,在没有获取到锁的情况下,线程将会进入到 BLOCKED(阻塞) 状态。

  5. 线程在执行 Runnable 的run()方法之后将会进入到 TERMINATED(终止) 状态。

6.说说创建线程的几种方式?


  1. 继承 Thread 类创建线程;

  2. 实现 Runnable 接口创建线程

  3. 通过 CallableFuture 创建线程

  4. 通过线程池创建线程

👨‍💻面试官又问:Runnable 和 Callable 有什么区别?

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

在面试前我整理归纳了一些面试学习资料,文中结合我的朋友同学面试美团滴滴这类大厂的资料及案例

MyBatis答案解析
由于篇幅限制,文档的详解资料太全面,细节内容太多,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!

大家看完有什么不懂的可以在下方留言讨论也可以关注。

觉得文章对你有帮助的话记得关注我点个赞支持一下!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
料及案例
[外链图片转存中…(img-txe0Jmbl-1713557043572)]

[外链图片转存中…(img-fF5UFVGu-1713557043573)]
由于篇幅限制,文档的详解资料太全面,细节内容太多,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!

大家看完有什么不懂的可以在下方留言讨论也可以关注。

觉得文章对你有帮助的话记得关注我点个赞支持一下!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值