在java学习中遇到的一些经典问题和解答(2)

1.进程和线程的区别是什么?

进程是运行中的程序,线程是进程中的一个执行序列
进程是资源分配的单元,线程是执行性单元
进程之间切换的代价大,线程之间切换代价小
进程拥有资源多,线程拥有的资源少
多个线程共享进程的资源

2.创建线程有几种不同的方式?

1.继承Thread类,重写run方法;
2.实现Runable接口,重写run方法(比继承Thread类好用,实现接口还可以继承类,避免了单继承带来的局限性;
3.实现callable接口,重写call方法,有返回值;
4.使用实现了Executor接口的ThreadPoolExecutor来创建线程池。

3.概括的解释下线程的几种可用状态

1.新建:新创建了一个线程对象
2.可运行:线程对象创建后,其他线程调用了该线程的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu的使用权。
3.运行:可运行状态的线程获得了cpu的时间片,执行程序代码。
4.阻塞:阻塞状态是指线程由于某种原因放弃了cpu的使用权,暂时停止运行。
5.死亡线程结束或者因为异常退出了run()方法。

4.同步方法和同步代码块的区别是什么?

同步方法默认用this或者当前类class对象作为锁;
同步代码块可以选择用什么来加锁;

同步方法使用关键字synchronized修饰方法
同步代码块主要使修饰需要进行同步的代码,用synchronized(object){代码内容}进行修饰

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

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

6.什么是死锁?

所谓死锁就是指多个进程因为竞争资源而造成一种僵局(互相等待),若无外力作用,这些线程都无法向前推。死锁产生的4个必要条件

互斥条件:进程要求所分配的资源进行排他性控制,即在一段时间内某资源仅作为一个进程所占有。此时如果有其他线程请求该资源,则请求线程只能等待
不剥夺条件:进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能由获得该资源的进程自己来释放。
请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已经被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。
循环等待条件:存在一种进程资源的循环等待链,链中每一个进程已获得的资源同时被链中下一个进程所请求。、

7.如何确保N个线程可以访问N个资源同时又不导致死锁?

使用多线程的时候,一种非常简单的避免死锁的方式就是:指定获取锁的顺序,并强制线程按照指定的顺序获取锁。因此,如果所有的线程都是以相同顺序加锁和释放锁,就不会出现死锁了

8.Java集合类框架的基本接口有哪些?

总共有两大接口:Collection和Map,一个是元素集合,一个是键值对集合;其中List和Set接口继承了Collection接口,一个是有序元素集合,一个是无序元素集合;而ArrayList和LinkedList实现了List接口,HashSet实现了Set接口,这几个都比较常用;HashMap和HashTable实现了Map接口。

9.为什么集合类没有实现Cloneable和Serializable接口?

克隆(cloning)或者序列化(serialization)的语义和含义是跟具体的实现相关的。因此,应该有集合类的具体实现来决定如何被克隆或者序列化

10.什么是迭代器(Iterator)?

迭代器是一种设计模式,提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。当你需要访问一个聚合对象,而且不管这些对象是什么都需要遍历的时候,就应该考虑使用迭代器模式。

猜你喜欢

转载自blog.csdn.net/huangpeng_HP/article/details/86554790
今日推荐