> 文章列表 > Java岗面试题--Java并发(日积月累,每日三题)

Java岗面试题--Java并发(日积月累,每日三题)

Java岗面试题--Java并发(日积月累,每日三题)

目录

  • 1、面试题一:sleep() 和 wait() 的区别?
  • 2、面试题二:什么是线程上下文切换?
  • 3、面试题三:什么是线程死锁?如何避免死锁?

1、面试题一:sleep() 和 wait() 的区别?

  1. sleep() 方法正在执行的线程主动让出 cpu(然后 cpu 就可以去执⾏其他任务),在 sleep 指定时间后 cpu 再回到该线程继续往下执行(注意:sleep 方法只让出了 cpu,而并不会释放同步资源锁);而 wait() 方法则是指当前线程让自己暂时退让出同步资源锁,以便其他正在等待该资源的线程得到该资源进而进行,只有调用了 notify() 方法,之前调用 wait() 的线程才会解除 wait 状态,可以去参与竞争同步资源锁,进而得到执行。(注意:notify 的 作用相当于叫醒睡着的人,而并不会给他分配任务,就是说 notify 只是让之前调⽤ wait 的线程有权利重新参与线程的调度);
  2. sleep() 方法可以在任何地方使用,而 wait() 方法则只能在同步方法或同步块中使用;

sleep() 是线程类 Thread 的方法,调用会暂停此线程指定的时间,但监控依然保持,不会释放对象锁,到时间自动恢复;
wait() 是 Object 的方法,调用会放弃对象锁,进入等待队列,待调用notify() / notifyAll() 唤醒指定的线程或者所有线程,才会进入锁池,不再次获得对象锁才会进入运行状态。

2、面试题二:什么是线程上下文切换?

使用多线程的目的是为了充分利用 CPU,但是我们知道,并发其实是一个 CPU 来处理多个线程。为了让用户感觉多个线程是在同时执行的, CPU 资源的分配采用了时间片轮转也就是给每个线程分配一个时间片,线程在时间片内占用 CPU 执行任务。当线程使用完时间片后,就会处于就绪状态并让出 CPU 让其他线程占用,这就是上下文切换。
Java岗面试题--Java并发(日积月累,每日三题)

3、面试题三:什么是线程死锁?如何避免死锁?

死锁:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。

死锁必须具备以下四个条件:

  1. 互斥条件;
  2. 请求与保持条件;
  3. 不剥夺条件;
  4. 循环等待条件。
    Java岗面试题--Java并发(日积月累,每日三题)
    Java岗面试题--Java并发(日积月累,每日三题)