Pharo 10.0(Smalltalk)上的多处理单例模式

问题描述 投票:0回答:1

我不能通过下面的测试

"SingletonTest"
testCurrent
        
    | semaphore object1 object2 |
    Singleton initialize.

    semaphore := Semaphore new.

    [ 
    Processor yield.
    object1 := Singleton initialize current.
    semaphore signal ] fork.

    object2 := Singleton initialize current.

    semaphore wait.
    self assert: object1 identicalTo: object2

这是失败的实现。

"Singleton class"
current

    current := current ifNil: [ 
                   (Delay forSeconds: 2) wait.
                   self new ].
    ^ current
initialize
    isProcessing := false.
    current := nil

我试图通过使用天真的排除控制来通过测试,但结果是一样的。

"Singleton class"
current

    [ isProcessing ] whileTrue: [  ].
    isProcessing := true.
    current := current ifNil: [ 
                   (Delay forSeconds: 2) wait.
                   self new ].
    isProcessing := false.
    ^ current
initialize
    isProcessing := false.
    current := nil

我怎样才能通过考试? 我期待听到您的建议!

design-patterns multiprocessing singleton smalltalk pharo
1个回答
1
投票

您没有提供

#'initialize'
的代码,我很想知道它是否将
current
设置为
nil
。尝试删除除第一次调用
#'initialize'
以外的所有内容,看看是否有帮助。

还要注意竞争条件是棘手的事情。在

#'current'
的第一个实现中,您有两秒钟的延迟,您可以在其中创建两个
Singleton
的实例。在第二个实现中,您可以让两个线程找到
isProcessing
false
并找到
current
nil
所以都等待两秒钟并创建它。

为了保证您只获得一个实例,您应该在设置代码中设置实例或使用

Semaphore
保护创建。

© www.soinside.com 2019 - 2024. All rights reserved.