5

我意识到由于内存模型,双重检查锁定在 java 中存在缺陷,但这通常与单例模式和优化单例的创建有关。

在objective-c的这种情况下呢:

我有一个布尔标志来确定我的应用程序是否是流数据。我有 3 种方法,startStreaming、stopStreaming、streamingDataReceived,我使用以下方法保护它们免受多个线程的影响:

- (void) streamingDataReceived:(StreamingData *)streamingData {
    if (self.isStreaming) {
        @synchronized(self) {
            if (self.isStreaming) {

- (void) stopStreaming {
    if (self.isStreaming) {
        @synchronized(self) {
            if (self.isStreaming) {

- (void) startStreaming:(NSArray *)watchlistInstrumentData {
    if (!self.isStreaming) {
        @synchronized(self) {
            if (!self.isStreaming) {

这是不必要的双重检查吗?仔细检查在objective-c中是否有与java中类似的问题?这种模式的替代品是什么(反模式)。

谢谢

4

2 回答 2

2

它同样有缺陷 - 你有一个竞争条件

您必须输入同步部分,然后检查标志

于 2010-06-07T14:49:13.603 回答
0

对我来说,这看起来像是过早的优化。有什么问题(例如)

- (void) startStreaming:(NSArray *)watchlistInstrumentData {
        @synchronized(self) {
            if (!self.isStreaming) {
...
于 2010-06-07T15:43:50.663 回答