|
|
![]() |
![]() |
尚学堂首页—新闻公告—常见问题 |
西安尚学堂Java面试基础题目及答案 |
www.xasxt.com 发布人:java | 来自:本站 | 发布时间:2019-07-15 08:58:00 | 点击次数:2918 |
![]() |
1.死锁的产生的一些特定条件
互斥条件:进程对于所分配到的资源具有排它性,即一个资源只能被一个进程占用,直到被该进程释放 。
请求和保持条件:一个进程因请求被占用资源而发生阻塞时,对已获得的资源保持不放。 不剥夺条件:任何一个资源在没被该进程释放之前,任何其他进程都无法对他剥夺占用。 循环等待条件:当发生死锁时,所等待的进程必定会形成一个环路(类似于死循环),造成永久阻塞。 2. 如何避免? 加锁顺序: 当多个线程需要相同的一些锁,但是按照不同的顺序加锁,死锁就很容易发生。如果能确保所有的线程都是按照相同的顺序获得锁,那么死锁就不会发生。 当然这种方式需要你事先知道所有可能会用到的锁,然而总有些时候是无法预知的。 加锁时限: 加上一个超时时间,若一个线程没有在给定的时限内成功获得所有需要的锁,则会进行回退并释放所有已经获得的锁,然后等待一段随机的时间再重试。 但是如果有非常多的线程同一时间去竞争同一批资源,就算有超时和回退机制,还是可能会导致这些线程重复地尝试但却始终得不到锁。 死锁检测: 死锁检测即每当一个线程获得了锁,会在线程和锁相关的数据结构中(map、graph等等)将其记下。除此之外,每当有线程请求锁,也需要记录在这个数据结构中。 死锁检测是一个更好的死锁预防机制,它主要是针对那些不可能实现按序加锁并且锁超时也不可行的场景。 3. 类在虚拟机中的加载过程
加载Loading: 通过一个类的全限定名来获取一个二进制字节流、将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构、在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。 验证Verification: 确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并不会危害虚拟机的自身安全。 准备Preparation: 正式为类变量分配内存并设置类变量初始值。 解析Resolution: 虚拟机将常量池内的符号引用替换为直接引用的过程。 初始化Initialization: 类加载过程的最后一步,到了这个阶段才真正开始执行类中定义的Java程序代码。 使用Using: 根据你写的程序代码定义的行为执行。 卸载Unloading: GC负责卸载,这部分一般不用讨论。
4.强引用、软引用、弱引用、虚引用与GC的关系
强引用:new出的对象之类的引用,只要强引用还在,永远不会回收。 软引用:引用但非必须的对象,内存溢出异常之前回收。 弱引用:非必须的对象,对象只能生存到下一次垃圾收集发生之前。 虚引用:对生存时间无影响,在垃圾回收时得到通知。
5.概括的解释下线程的几种状态 就绪(Runnable):线程准备运行,不一定立马就能开始执行。 运行中(Running):进程正在执行线程的代码。 等待中(Waiting):线程处于阻塞的状态,等待外部的处理结束。 睡眠中(Sleeping):线程被强制睡眠。 I/O阻塞(Blocked on I/O):等待I/O操作完成。 同步阻塞(Blocked on Synchronization):等待获取锁。 死亡(Dead):线程完成了执行。
6. Java集合类里面基本的接口有哪些 Collection:代表一组对象,每一个对象都是它的子元素。 Set:不包含重复元素的Collection。 List:有顺序的collection,并且可以包含重复元素。 Map:可以把键(key)映射到值(value)的对象,键不能重复。
7.notify和notifyAll区别 他们的作用都是通知处于等待该对象的线程。 1、notifyAll使所有原来在该对象上等待被notify的线程统统退出wait的状态,变成等待该对象上的锁,一旦该对象被解锁,他们就会去竞争。 2、notify是通知其中一个线程,不会通知所有的线程。
8.内部类和静态内部类的区别 内部类: 内部类中的变量和方法不能声明为静态的。 内部类实例化:B是A的内部类,实例化B:A.B b = new A().new B()。 内部类可以引用外部类的静态或者非静态属性及方法。 静态内部类: 静态内部类属性和方法可以声明为静态的或者非静态的。 实例化静态内部类:B是A的静态内部类,A.B b = new A.B()。 静态内部类只能引用外部类的静态的属性及方法。 inner classes——内部类 static nested classes——静态嵌套类 其实人家不叫静态内部类,只是叫习惯了,从字面就很容易理解了。 内部类依靠外部类的存在为前提,而静态嵌套类则可以完全独立,明白了这点就很好理解了。
9.非静态内部类中的变量和方法不能声明为静态的原因 静态类型的属性和方法,在类加载的时候就会存在于内存中。使用某个类的静态属性和方法,那么这个类必须要加载到虚拟机中。但是非静态内部类并不随外部类一起加载,只有在实例化外部类之后才会加载。 我们设想一个场景:在外部类并没有实例化,内部类还没有加载的时候如果调用内部类的静态成员或方法,内部类还没有加载,却试图在内存中创建该内部类的静态成员,就会产生冲突。所以非静态内部类不能有静态成员变量或静态方法。
10.Enumeration和Iterator的区别
java中的集合类都提供了返回Iterator的方法,就是迭代器,它和Enumeration(枚举)的主要区别其实就是Iterator可以删除元素,但是Enumration却不能。 使用Iterator来遍历集合时,应使用Iterator的remove()方法来删除集合中的元素,使用集合的remove()方法将抛出ConcurrentModificationException异常。 Enumeration接口的功能和Iterator接口的功能是重复的。此外,Iterator 接口添加了一个可选的移除操作,并使用较短的方法名。新的实现应该优先考虑使用Iterator接口而不是Enumeration接口。 Enumeration速度是Iterator的2倍,同时占用更少的内存。但是,Iterator远远比Enumeration安全,因为其他线程不能够修改正在被iterator遍历的集合里面的对象。
|
|