我不能通过下面的测试
"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
我怎样才能通过考试? 我期待听到您的建议!
您没有提供
#'initialize'
的代码,我很想知道它是否将current
设置为nil
。尝试删除除第一次调用 #'initialize'
以外的所有内容,看看是否有帮助。
还要注意竞争条件是棘手的事情。在
#'current'
的第一个实现中,您有两秒钟的延迟,您可以在其中创建两个 Singleton
的实例。在第二个实现中,您可以让两个线程找到 isProcessing
为 false
并找到 current
为 nil
所以都等待两秒钟并创建它。
为了保证您只获得一个实例,您应该在设置代码中设置实例或使用
Semaphore
保护创建。