11.死锁产生的条件?
条件分别是:互斥条件、占有和等待条件、不剥夺条件、循环等待条件。
-
互斥条件:每个资源每次只能被一个进程使用,即在一段时间内某资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待。
-
占有和等待条件:进程已经保持了至少一个资源,但又提出了新的资源请求时,该资源已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。
-
不剥夺条件:进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能由获得该资源的进程自己来释放(只能是主动释放)。
-
循环等待条件:若干进程间形成首尾相接循环等待资源的关系。
12.什么是线程死锁?
简单来说就是两个或两个以上的线程在执行过程中互相抢夺资源,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。
13.synchronized和lock的定义及区别
synchronized:是Java中的关键字,是一种同步锁,可以修饰代码块、静态的方法、方法、类。
lock:是J.U.C包下的一个接口,其下边有很多实现类,ReentrantLock便是一个实现类。
区别:
-
实现方式:Lock接口是JDK1.8及以上版本提供的,而synchronized是JDK1.0及以上版本提供的。
-
适应性:Lock接口适用于多线程编程,而synchronized适用于多线程编程。
-
锁定状态:Lock可以主动释放锁定,而synchronized不能。
-
锁定顺序:Lock的锁定是按照对象创建的顺序进行锁定的,而synchronized的锁定是按照对象被声明的顺序进行锁定的。
-
锁定粒度:Lock可以锁住方法或者代码块,而synchronized只能锁住代码块。
-
公平性:Lock在多线程竞争时是公平的,而synchronized在多线程竞争时不是公平的。
-
阻塞性:Lock是非阻塞的,而synchronized是阻塞的。
-
兼容性:Lock是Java原生支持的接口,而synchronized不是。
14.内存溢出与内存泄漏?
内存溢出:在JVM中所剩空间无法满足新建对象所占用的空间,从而会导致内存的溢出,也就像容器满了而溢出。
内存泄漏:简单来说就是程序执行后没有及时释放资源从而导致大量的资源对象造成堆积而无法回收从而发生内存溢出,称为内存泄漏
这两种种情况通常是由于程序在申请内存时没有正确地检查可用内存大小,或者在释放内存时没有正确地释放所有分配的内存块。
可能的解决办法:
1.尽量减少使用静态变量,或者使用完及时 赋值为 null。
2.明确内存对象的有效作用域,尽量缩小对象的作用域,能用局部变量处理的不用成员变量,因为局部变量弹栈会自动回收;
3.减少长生命周期的对象持有短生命周期的引用;
15.并发与并行的定义?
并发:在同一时刻,有多个指令在单个CPU上交替执行
并行:在同一时刻,有多个指令在多个CPU上同时执行
16.Java中的集合,单列集合与多列集合
单列集合:顶级接口为Collection
Collection子接口有:List和Set
list接口实现类:ArrayList底层实现为数组,线程不安全,效率高;
:LinkedList底层实现为链表,线程不安全,效率高;
set接口实现类:HashSet底层实现hashMap,数组+链表实现。
:TreeSet底层实现红黑二叉树。
多列集合:顶级接口为Map
Map接口实现类:
HashMap:底层数组+链表。
TreeMap:底层红黑二叉树。
LinkedHashMap:底层hashmap+linkedList。