线程六种状态分别有哪些?
1. 初始(NEW):新创建了一个线程对象,但还没有调用start()方法。
2. 运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的称为“运行”。
线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取CPU的使用权,此时处于就绪状态(ready)。就绪状态的线程在获得CPU时间片后变为运行中状态(running)。
3. 阻塞(BLOCKED):表示线程阻塞于锁。
4. 等待(WAITING):进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。
5. 超时等待(TIMED_WAITING):该状态不同于WAITING,它可以在指定的时间后自行返回。
6. 终止(TERMINATED):表示该线程已经执行完毕。
确定测试计划是在 ( ) 阶段制定的。
A 总体设计
B 详细设计
C 编码
D 测试
A
典型的总体设计过程包括下面9个步骤:设想供选择的方案、选取合理的方案、推荐最佳方案、功能分解、设计软件结构、设计数据库、制定测试计划、书写文档、审查和复审。
下面几种白盒测试技术,哪种是最强的覆盖准则()。
A 语句覆盖
B 条件覆盖
C 判定覆盖
D 条件组合覆盖
D
六种覆盖方法中,覆盖准则由弱到强依次是语句覆盖、判定覆盖(分支覆盖)、条件覆盖、判定/条件覆盖、条件组合覆盖、路径覆盖。
其中,
语句覆盖是使得程序中每个语句至少被执行一次;
判定覆盖是使得程序中的每个分支至少都通过一次;
条件覆盖是使得判定中的每个条件获得各种可能的结果;
判定/条件覆盖是使得判定中的每个条件取到各种可能的值,并使每个判定取到各种可能的结果;
条件组合覆盖是使得每个判定中条件的各种可能组合都至少出现一次;
下面属于黑盒测试方法的是()。
A.错误推测法(猜错法)
B.基本路径测试
C.条件覆盖
D.条件-分支覆盖
A
软件的( )一般由两次故障平均时间和故障平均恢复时间来衡量。
A.可维护性
B.可靠性
C.效率
D.互理解性
B
需求分析阶段的任务是确定( )。
A.软件开发方法
B.软件开发工具
C.软件开发费用
D.软件系统功能
D
产生死锁的四个必要条件?
(1)互斥条件:进程对所分配到的资源不允许其他进程进行访问,若其他进程访问该资源,只能等待,直至占有该资源的进程使用完成后释放该资源
(2)请求和保持条件:进程获得一定的资源之后,又对其他资源发出请求,但是该资源可能被其他进程占有,此事请求阻塞,但又对自己获得的资源保持不放
(3)不可剥夺条件:是指进程已获得的资源,在未完成使用之前,不可被剥夺,只能在使用完后自己释放
(4)环路等待条件:是指进程发生死锁后,必然存在一个进程–资源之间的环形链
死锁概念及产生原理
概念:多个并发进程因争夺系统资源而产生相互等待的现象。
原理:当一组进程中的每个进程都在等待某个事件发生,而只有这组进程中的其他进程才能触发该事件,这就称这组进程发生了死锁。
本质原因:
1)系统资源有限。
2)进程推进顺序不合理。
以下关于final关键字说法错误的是(A,C)(两项)
A) final是java中的修饰符,可以修饰类、接口、抽象类、方法和属性
B) final修饰的类肯定不能被继承
C) final修饰的方法不能被重载
D) final修饰的变量不允许被再次赋值
在Java中常见的几个类,如:Interger/String等,都实现了java.io.Serializable接口。这个序列化接口没有任何方法和域,仅用于标识序列化语意;实现 Serializable 接口的类是可序列化的,没有实现此接口的类将不能被序列化和反序列化。序列化类的所有子类本身都是可序列化的,不再需要显式实现 Serializable 接口。只有经过序列化,才能兼容对象在磁盘文本以及在网络中的传输,以及恢复对象的时候反序列化等操作。
序列化就是对实例对象的状态(State 对象属性而不包括对象方法)进行通用编码(如格式化的字节码)并保存,以保证对象的完整性和可传递性。
简而言之:序列化,就是为了在不同时间或不同平台的 JVM 之间共享实例对象
wait() 方法表示,放弃当前对资源的占有权,一直等到有人通知,才会运行后面的代码。
notify() 方法表示,当前的线程已经放弃对资源的占有, 通知等待的线程来获得对资源的占有权,但是只有一个线程能够从wait 状态中恢复,然后继续运行 wait() 后面的语句;
notifyAll() 方法表示,当前的线程已经放弃对资源的占有, 通知所有的等待线程从 wait() 方法后的语句开始运行。
java 并发之同步辅助类 CountDownLatch
含义:
CountDownLatch可以理解为一个计数器在初始化时设置初始值,当一个线程需要等待某些操作先完成时,需要调用await()方法。这个方法让线程进入休眠状态直到等待的所有线程都执行完成。每调用一次countDown()方法内部计数器减1,直到计数器为0时唤醒。这个可以理解为特殊的CyclicBarrier。线程同步点比较特殊,为内部计数器值为0时开始。
方法:
核心方法两个:countDown() 和 await()
countDown():使 CountDownLatch 维护的内部计数器减 1 ,每个被等待的线程完成的时候调用
await():线程在执行到 CountDownLatch 的时候会将此线程置于休眠
Java1.5的 Atomic 包名为 java.util.concurrent.atomic。这个包提供了一系列原子类。这些类可以保证多线程环境下,当某个线程在执行 atomic 的方法时,不会被其他线程打断,而别的线程就像自旋锁一样,一直等到该方法执行完成,才由 JVM 从等待队列中选择一个线程执行。Atomic 类在软件层面上是非阻塞的,它的原子性其实是在硬件层面上借助相关的指令来保证的。
Linux虚拟文件系统通用文件系统模型由下列对象组成:
1. 超级块对象
存放已安装文件系统的有关信息。对基于磁盘的文件系统,这类对象通常对应于存放在磁盘上的文件系统控制块。
2. 索引节点对象
存放关于具体文件的一些信息。对于磁盘文件系统,这类对象通常对应与存放在磁盘上的文件控制块。每个索引节点对象都对应与一个索引节点号,这个节点号唯一标识了文件系统上的文件。
3. 文件对象
存放打开文件与进程之间进行交互的有关信息。这类信息仅当进程访问文件期间存放于内核内存中。
4. 目录项对象
存放目录项(也就是文件的特定名称)与对应文件进行链接的有关信息。每个磁盘文件系统都以自己特有的方式将该类信息存放在磁盘上。
5. 挂接点结构
每个已经挂装的文件系统用挂接点对象结构 vfsmout 描述,所有的结构 vfsmount 实例形成了一个链表,用全局变量 vfsmntlist 指向链表头,该链表可称为已挂接文件系统链表。Linux 支持一个文件系统挂接多次,但他们仅有一个超级块,每个挂接点用挂接点结构 vfsmount 描述。
挂接点对象分类连接成不同的链表。
6. 命名空间结构
每个进程可以拥有属于自己的已挂接文件系统树,称为命名空间。通常大多数进程共享一个文件系统命名空间,即系统的根文件系统。命名空间被子进程继承,但如果系统调用 clone() 用标示 CLONE_NEWNS 创建一个新进程时,那么新进程将获得一个新命名空间。
进程挂接或卸载文件系统时,仅修改它的命名空间,在同一命名空间的进程才可见这些修改,修改对其他命名空间没有影响。
7. 文件系统类型结构
Linux 内核支持多种文件系统,各个文件系统可以作为内核模块或者作为内核一部分进行编译,linux 内核使用文件系统类型结构 file_system_type 对各种文件系统进行跟踪。
文件系统注册后,不同类型的文件系统存放在全局变量的链表 file_systems 中,同一类型的多个文件系统将超级块链表到结构 file_system_type 的成员 fs_supers上,通过全局变量 file_systems ,可以找到文件系统类型结构,从该结构可以找到方法 (*get_sb)() 获取文件系统的超级块,也就可以访问该文件系统了。
Er服务是啥?都有人仿你站了,牛
@21sta 我表示也很无奈,一个小破站,居然还有人镜像。。。
面试确实很有技巧