Java面试日常归纳(2)

以下试题均来自牛客网

(1)
概括的解释下线程的几种可用状态?

1.新建态(new):新创建了一个线程对象。
2.可运行(runnable):线程对象创建后 ,其他线程中(比如main线程)调用了对象的start方法。该状态的线程就将位于可运行线程池中,具有可运行权,等待CPU的调度。
3.运行态(running):可运行状态的线程获得了CPU时间片。
4.阻塞状态(block):阻塞状态是指线程因为某种原因放弃了CPU使用权,暂时停止运行。直到线程进入可运行状态,才有机会再次得到CPU的调度。
阻塞状态分为以下三种:
(一):等待阻塞:运行线程执行了o.wait()方法,JVM会把该线程放入到等待队列中。
(二):同步阻塞:运行的线程在获得对象的同步锁时,若该同步锁已经被别的线程占用了,则JVM会把该线程放在锁池中,等待锁的释放。
(三):其他阻塞:当运行的线程执行了Thread.sleep(long ms)或t.join()方法时,或者发出了I/O请求时,JVM会把改线程超时置为阻塞状态。当sleep()状态超时,join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转为可运行状态。
5.死亡(dead):线程run()方法执行完毕、main()方法终止、或者因异常退出了run()方法,则该线程结束生命周期。死亡的线程不能再次复生。
Java面试日常归纳(2)

(二)
同步方法和同步代码块的区别是什么?

同步方法默认用this或者当前类class作为锁。
同步代码块可以选择以什么来加锁,比同步方法控制的更加精准。
同步方法使用synchronized修饰方法,而同步代码块主要是修饰需要进行同步的代码使用synchronized(object){需要同步的代码}进行修饰。

(三)
在监视器(monitor)内部,是如何做线程同步的?程序应该做哪种级别的同步?

监视器和锁在Java虚拟机中是一块使用的。监视器监视一块同步代码块,确保一次只有一个线程执行同步代码块,每一个监视器都和一个对象的引用相关联。线程在获得对象锁之前是不允许执行同步代码。

(四)
什么是死锁?

所谓死锁是指多个进程竞争资源导致相互等待,若无外力作用,这些进程将无法向前推进。死锁会有四个必要条件:
1.互斥条件:进程要求所分配的资源进行排他性控制,即在一段时间内,只允许一个进程占有该资源,若此时有其他进程请求该资源,那么该进程只能等待。
2.不可剥夺条件:进程获得了资源但未释放之前,不能被其他进程强行剥夺,只能由获得该资源的进程自己来释放、
3.请求和保持条件:进程已经持有一个资源,但又提出了新的资源请求,二该资源已经被其他资源占有,此时请求进程将会被阻塞,但是对自己已经占有的资源并不释放。
4.循环等待条件:存在一种进程资源循环等待链,链中每一个进程已获得的组员同事被链中下一个进程所请求。

(五)
集合框架中基本接口有哪些?

Collection:代表一组对象,每一个对象都是它的子元素。
Set:不包含:包含不重复元素的Collection。
List:有顺序的Collection,并且可以包含重复元素。
Map:可以吧键映射到值得对象,键不可以重复。