2.下面有关值类型和引用类型描述正确的是(A)?
A.值类型的变量赋值只是进行数据复制,创建一个同值的新对象,而引用类型变量赋值,仅仅是把对象的引用的指针赋值给变量,使它们共用一个内存地址。
B.值类型数据是在栈上分配内存空间,它的变量直接包含变量的实例,使用效率相对较高。而引用类型数据是分配在堆上,引用类型的变量通常包含一个指向实例的指针,变量通过指针来引用实例。
C.引用类型一般都具有继承性,但是值类型一般都是封装的,因此值类型不能作为其他任何类型的基类。
D.值类型变量的作用域主要是在栈上分配内存空间内,而引用类型变量作用域主要在分配的堆上。
解析:
B错在,值类型变量不包含实例,实例是针对于对象的概念,当类实例化为对象的时候,这个时候可以称为是类的一个实例。同时,效率比较高这个概念比较模糊。
C错在,封装的概念也是针对类而言的,值类型数据不存在封装概念。
D错在,值类型变量可以作为成员变量存储在堆里,例如一个Class A中包含一个int value,那么value是作为成员变量存储在堆中的。D选项表述有漏洞。
3.如何在多线程中避免发生死锁?
A.允许进程同时访问某些资源。
B.允许进程强行从占有者那里夺取某些资源。
C.进程在运行前一次性地向系统申请它所需要的全部资源。
D.把资源事先分类编号,按号分配,使进程在申请,占用资源时不会形成环路。
解析:
死锁:在多道程序设计环境下,多个进程可能竞争一定数量的资源,。一个进程申请资源,如果资源不可用,那么进程进入等待状态。如果所申请的资源被其他等待进程占有,那么该等待的进程有可能无法改变状态,这种情况下称之为死锁。
死锁的四个条件:
1.互斥:至少有一个资源必须处在非共享模式,即一次只能有一个进程使用,如果另一进程申请该资源,那么申请进程必须延迟直到该资源释放为止。
2.占有并等待:一个进程必须占有至少一个资源,并等待另一个资源,而该资源为其他进程所占有。
3.非抢占:资源不能被抢占
4.循环等待:有一组进程{P0,P1,…Pn},P0等待的资源被P1占有,P1等待的资源被P2占有,Pn-1等待的资源被Pn占有,Pn等待的资源被P0占有。
形成死锁必须要满足这四个条件。那么违背这几个条件中的任何一个就不会形成死锁,这种方式成为 死锁预防,而死锁避免是动态的检测分配资源的状态是否安全
- 死锁解决方式
- 死锁预防
- 死锁避免
- 死锁检测并恢复
三者处理死锁的方式可以类比为:死锁预防,直接铲平坑;死锁避免,直接跳过坑;死锁检测并恢复,摔到坑里,修正一下继续前行。
对于互斥而言:有的资源本身就是互斥的,所以通常