(2019春)软件构造:雨课堂试卷(第十章)

目录

    • 多选题 第1题 2分
    • 多选题 第2题 2分
    • 多选题 第3题 2分
    • 多选题 第4题 2分
    • 多选题 第5题 2分
    • 多选题 第6题 2分
    • 填空题 第7题 3分
    • 多选题 第1题 2分
    • 多选题 第2题 2分
    • 多选题 第3题 2分
    • 单选题 第4题 2分
    • 单选题 第5题 1分
    • 多选题 第6题 2分
    • 多选题 第7题 2分

多选题 第1题 2分

以下__是计算机系统中的concurrency现象?

A 手机上的一个App通过5G网络访问云端数据
B 四核CPU,执行多道程序
C 使用Observer设计模式的Java程序,其中Subject类和Observer类的执行
D 一亿人同时登陆12306网站抢购春运火车票
E 使用JVM参数-XX:+UseConcMarkSweepGC启动的程序,运行时进行GC
F 同一个Java程序内的两个线程,共享一个mutable的Java对象

正确答案:ABDEF

多选题 第2题 2分

关于process和thread的说法,不正确的是_

A 多个process之间不共享内存,而多个thread之间可共享内存
B CPU的某个核,在特定时间点只能运行单一process,但可并行执行多个thread
C 手机上的App通过5G网络访问云服务器的资源,手机上和服务器上运行的是不同的thread而非不同的process
D 一个process可以包含多个thread,一个thread只能在一个process里运行

正确答案:BC

多选题 第3题 2分

关于如何创建thread的说法,不正确的是__

A 从Thread类派生子类A,创建线程时(new A()).start()
B 类A实现Runnable接口,并实现其run()方法,创建线程时(new Thread(new A())).run()
C new Thread(new Runnable(){
public void run() {…};
}).start();
D new Thread(new Runnable(){
public void run() {…};
}).run();

正确答案:BD

多选题 第4题 2分

关于time slicing, interleaving和race condition的说法,正确的是__

A Time slicing由OS决定,但程序员可在代码中进行若干有限度的控制
B 如果某程序执行结果的正确与否依赖于time slicing,那么意味着程序执行中产生了race condition
C 程序interleaving执行的基本单元是Java代码行
D 同一个并发程序的多次执行中的time slicing可能完全不同,因此bug很难复现,将此类bug形象的成为Bohrbugs

正确答案:AB

多选题 第5题 2分

关于Java Thread的sleep()和interrupt(),不正确的是__

A 若线程的run()代码中包含Thread.sleep(100),意味着该线程停止执行100ms,CPU交给其他线程/进程使用
B 线程t1中包含代码t1.interrupt(),意味着执行完该语句后t1被停止,不会再获得time slicing
C 线程t1在sleep()期间可捕获到其他线程发来的中断信号并抛出InterruptedException异常
D 线程若捕获了抛出InterruptedException异常,则自动终止执行

正确答案:BD
解析:正常运行期间,即使接收到中断信号,也不理会。
在 sleep() 的时候检测是否收到别人的中断信号。若是,抛出异常。
进入异常处理后,线程才真正终止。

多选题 第6题 2分

Thread t = new Thread(new Runnable(){
public void run(){
try{
print(“a”);

Thread.sleep(200);
}catch(InterruptedException e){
print(“b”);
}
print(“c”);
};});

t.start();

t.interrupt();
某类的main()代码如上所示,执行后可能的输出结果为___
A ab
B ac
C bc
D abc

正确答案:BD

填空题 第7题 3分

如果希望让线程t执行结束之后再执行其他线程,即让其他线程暂停,需要调用t.填空1;
正确答案:join()
用于“检测当前线程是否收到其他线程发来的中断信号”的Thread静态方法是Thread.填空2
Interrupted()
在线程类的run()方法中有以下代码,如果希望收到中断信号后终止线程执行,则TODO位置的语句应该是 [填空3]
return;
try{

Thread.sleep(1000);

} catch(InterruptedException e){
TODO;
}
正确答案:
join;interrupted;return

10-2 线程安全

多选题 第1题 2分

以下关于ADT ThreadSafe的说法,不正确的是__

A 任何对外发布的ADT都必须要做到thread safe
B 不管怎么time slicing和interleaving,一个线程安全的ADT对象的RI要始终为真
C 在不同的机器上、不同的OS上执行关于该ADT的程序,都不应该出现RI被违反的情况
D 任何immutable的ADT都是threadsafe的
E 做到ThreadSafe与否,只与ADT自己的内部rep和内部方法实现有关,与client是否应遵循特定条件有关

正确答案:AD
答案解析:

A选项:不一定,例如JDK里就有不少在多线程程序里不安全的ADT,比如List,Iterator。这种情况可以在spec里写清楚即可。但是,最好提供与之相对应的threadsafe的ADT。

B、C、E选项都是在表达ThreadSafe的一个重要约束:threadsafe与你的程序在什么软硬件环境下运行、被谁的程序所调用,没有关系。

D:beneficent mutation

多选题 第2题 2分

关于Strategy 1: Confinement的说法,不正确的是__

A 多线程之间不要共享mutable的数据对象
B 各线程内部不应使用mutable的数据对象
C 只要ADT的rep里存在static类型的变量,该ADT在任何多线程场景下都无法做到threadafe
D 只要ADT的rep里存在mutable类型的变量,该ADT在任何多线程场景下都无法做到threadsafe

正确答案:BCD
答案解析:

A选项是该策略的核心思想

B选项:线程内部当然可以用mutable的对象,只要它们被限定只在该线程中使用(不和别的线程共享,局限在自己的thread stack中),即符合该策略

C选项:如果该static属性是immutable的且不存在其他mutable的属性(或者这些mutable的属性通过其他策略确保的安全性),那么可以做到线程安全

D限选:见C选项的解释

多选题 第3题 2分

针对Strategy 2: Immutability,不正确的说法是__

A 该策略思想是:多线程之间共享数据时,使用不可变数据类型和不可变引用,以避免多线程之间的race condition
B 如果多线程共享的是mutable的数据类型,可以通过在线程中禁用其mutator方法来达到threadsafe
C 如果ADT的rep里所有属性都是final的,那么它在任何多线程场景下都可以做到threadafe
D 如果ADT的rep里存在public类型的属性,那么它就无法确保做到threadsafe

正确答案:BC
答案解析:
B选项:threadsafe不能要求client作什么,一定是你ADT的职责

C选项:光final还不够,指向的对象还得是immutable的。否则多线程就可以对其值的修改产生race condition

D选项:public属性意味着rep exposure,那线程就可以修改其rep,就可能产生race condition。该策略要求所有的变量都是private and final。

单选题 第4题 2分

针对Strategy 3: Using Threadsafe Data Types策略,不正确的是__

A 如果必须要用mutable的数据类型在多线程之间共享数据,要使用线程安全的数据类型
B 若在ADT的rep里使用集合类,最好使用SynchronizedMap/Syn…List/Syn…net
C 若能做到B选项中的说法,该ADT在任何多线程场景下都可以做到threadsafe
D 即使在线程安全的集合类上,使用iterator也是不安全的

正确答案:C

单选题 第5题 1分

public class P{
private static P p = null;
// invariant: only one P object
// should be created

public static P getInstance() {
  1.  if(p == null) {
    
  2.  	p = new P();
     }
    
  3.  return P;
    
    }

    }

有两个线程,其run()方法都是在调用getInstance()。
如果线程1正在执行语句1,线程2正在执行语句3,那么两个线程之间是否会产生race并导致invariant被违反?
A YES
B NO

正确答案:A

多选题 第6题 2分

public String t = new String();
private List ol = new ArrayList<>();
private final List ls = Collections.synchronizedList(ol);
某ADT的Rep如上所示,该ADT在被用于多线程场景时的threadsafe,以下说法不正确的是___

A t不存在线程安全风险,因为它是String类型,是immutable的
B ol存在线程安全风险,因为List<>不是线程安全的数据类型
C ls不存在线程安全风险,因为它用synchronizedList做了封装
D ls存在线程安全风险,可能在该ADT的某方法中存在对ls的多个方法的调用,可能产生race

正确答案:AC

多选题 第7题 2分

线程1:

if ( ! lst.isEmpty()) {
	String s = lst.get(0);
	...
}
线程2:
if ( lst.size() >=1) {
	lst.remove(0);
	...
}

其中lst是利用Collections.synchronizedList()得到的List对象,下列正确的是:

A 因为lst是线程安全的数据类型,故两个线程不存在race condition
B 线程1的isEmpty()和线程2的size()之间的race condition造成未期望的后果
C 线程1的isEmpty()和线程2的remove()产生race condition造成未期望的后果
D 线程1的get()和线程2的remove()产生race condition造成未期望的后果

正确答案:CD

你可能感兴趣的:(其他)