软件构造复习小知识点总结(3)

问题1.
以下关于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

个人分析:
这道题的E选项应该写错了,应更正为“做到ThreadSafe与否,只与ADT自己的内部rep和内部方法实现有关,与client是否应遵循特定条件无关”,这样才与答案解析能对应上
然后对于D选项,PPT原文:
在这里插入图片描述
这里是通常,因为不可变类型的定义太松了,为了确信不可变数据类型在没有锁的情况下是线程安全的,我们需要一个更强的不可变定义:
–无突变方法
–所有字段都是私有的和最终的
–无代表性曝光
–代表中的可变对象没有任何变异
–甚至不是有益的突变

问题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

个人分析:
这道题的D选项,我感觉可以让public类型的属性,同时是immutable和final,这样即使是public,也是不可被改变的。所以感觉D也是错误的。后来咨询了某位学神,他直接给了我三种解释:
1.pubilic且final且immutable这样的数据类型没有意义。因为这样的数据只能读,不能写,不是多线程的本意
2.D说的是无法确保,就是说有可能不能保证线程安全,就是说可能线程安全,也可能线程不安全,所以D这样说没问题。。。
3.还有一种说法是:rep暴露就是不安全,线程安全的前提要先保证rep不泄露

虽然总感觉都有点牵强,但总而言之都是可以接受的

习题来源:
https://blog.csdn.net/HITcs_Sxf/article/details/90473259

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值