文章目录

  • 10-1 Concurrency
  • 多选题 第1题 2分
  • 多选题 第2题 2分
  • 多选题 第3题 2分
  • 多选题 第4题 2分
  • 多选题 第5题 2分
  • 多选题 第6题 2分
  • 填空题 第7题 3分
  • 10-2 线程安全
  • 多选题 第1题 2分
  • 多选题 第2题 2分
  • 多选题 第3题 2分
  • 多选题 第4题 2分
  • 单选题 第5题 1分
  • 多选题 第6题 2分
  • 多选题 第7题 2分


10-1 Concurrency

多选题 第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的说法,不正确的是__

AThread类派生子类A,创建线程时(new A()).start()BA实现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

多选题 第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

正确答案:BC
//更正:BD

填空题 第7题 3分

如果希望让线程t执行结束之后再执行其他线程,即让其他线程暂停,需要调用t.[填空1]();

用于“检测当前线程是否收到其他线程发来的中断信号”的Thread静态方法是Thread.[填空2]()

在线程类的run()方法中有以下代码,如果希望收到中断信号后终止线程执行,则TODO位置的语句应该是 [填空3]

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。这种情况可以在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

多选题 第4题 2分

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

A 如果必须要用mutable的数据类型在多线程之间共享数据,要使用线程安全的数据类型
B 若在ADT的rep里使用集合类,最好使用SynchronizedMap/Syn..List/Syn..netC 若能做到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<String> ol = new ArrayList<>();
private final List<String> ls = Collections.synchronizedList(ol);

ADTRep如上所示,该ADT在被用于多线程场景时的threadsafe,以下说法不正确的是___

At不存在线程安全风险,因为它是String类型,是immutable
B ol存在线程安全风险,因为List<>不是线程安全的数据类型
Cls不存在线程安全风险,因为它用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 conditionB 线程1isEmpty()和线程2size()之间的race condition造成未期望的后果
C 线程1isEmpty()和线程2remove()产生race condition造成未期望的后果
D 线程1get()和线程2remove()产生race condition造成未期望的后果

正确答案:CD