15个顶级Java多线程面试题(附答案)攻略
多线程是Java中非常重要的一个知识点,在Java面试中也被频繁提到。以下是关于15个顶级Java多线程面试题的详细攻略。
1. Java线程的状态有哪些?四种状态分别是什么?
答:Java线程的状态有五种,分别是:
- 新建状态(new): 当线程对象被创建时,线程处于新建状态。
- 就绪状态(runnable): 当线程对象调用了start()方法,线程就进入就绪状态,但并不是马上就开始执行,它要等待获取CPU资源,也就是进入运行状态。
- 运行状态(running): 线程获得CPU资源,开始执行run方法中的代码。
- 阻塞状态(blocked): 线程在某些情况下会进入阻塞状态,如等待某个资源的时候,线程会进入阻塞状态,当条件满足的时候,进入就绪状态。
- 死亡状态(terminated): 当线程run()方法执行结束或者线程抛出了未捕获的异常时,线程死亡。
示例:在Java线程中使用synchronized关键字获取锁时,当锁被其他线程占用的时候,该线程就会进入阻塞状态。
2. sleep()和wait()的区别是什么?
答:sleep()和wait()都可以使线程暂停执行,但是它们的作用不同。
- sleep()方法是Thread类的静态方法,使当前线程暂停执行一段时间,不带参的sleep()方法会使线程睡眠一段时间后继续执行,带参的sleep()方法使线程睡眠指定的时间。
- wait()方法是Object的方法,可以使当前线程等待其他线程的通知。在使用wait()方法时,线程必须获得对象的锁,否则会抛出IllegalMonitorStateException异常。wait()方法会使线程释放对象的监视器,进入等待池,并在下一次获取对象锁时重新进入到对象的同步队列中等待唤醒。
示例:在生产者-消费者模型中,使用wait()方法使得消费者因为缺乏资源而进入等待状态,使用notify()方法唤醒生产者,来保证消费者和生产者的协作。
3. ReentrantLock和synchronized的区别是什么?
答:ReentrantLock和synchronized都可以实现线程同步,但是它们有以下区别:
- ReentrantLock提供了更加灵活的锁获取和释放方式。synchronized关键字一旦获取了锁,只能等待锁被释放,而ReentrantLock可以根据需要获取锁或继续等待,也可以在获取锁的时候设置一个超时时间。
- ReentrantLock提供了可重入锁的功能,也就是同一个线程可以多次获取同一个锁,而synchronized关键字不支持重入,同一个线程只能获取一次同步锁。
- ReentrantLock提供了公平锁和非公平锁的支持,而synchronized是非公平锁。
示例:在Java并发包中使用ReentrantLock来保证多个线程对同一个资源的同步访问,例如线程池中管理线程的运行状态。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:15个顶级Java多线程面试题(附答案) - Python技术站