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

    技术2023-08-08  98

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

    Processed: 0.013, SQL: 10