在下面的代碼中,我們有一個可變數組,它由兩個併發隊列進行變異。由於併發隊列不是線程安全的,因此這段代碼最好應該崩潰,但是這個代碼不會發生任何異常或崩潰。使用全局併發隊列從兩個不同線程中變換陣列時不會發生崩潰
請幫助我理解這種行爲。任何幫助將不勝感激:-)
@interface ViewController()
@property(nonatomic, strong) NSMutableArray *arr;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.arr = [NSMutableArray new];
}
-(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
__weak typeof(self) weakSelf = self;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
for (int i = 0; i < 20000; i++) {
[weakSelf.arr addObject:[NSNumber numberWithInt:i]];
NSLog(@"Added %@", [weakSelf.arr lastObject]);
}
NSLog(@"Final count %ld", [self.arr count]);
});
[self performSelector:@selector(removeObjects) withObject:nil afterDelay:0.1];
}
-(void)removeObjects{
__weak typeof(self) weakSelf = self;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
for (int i = 0; i < 1000; i++) {
if (weakSelf.arr.count > 1) {
[weakSelf.arr removeObjectAtIndex:0];
}
NSLog(@"Remove object");
}
});
}
@end
也許你只是幸運。我可能是錯的,但我不確定你的代碼是否保證崩潰;我認爲這只是不保證不會崩潰...根據定義,你不能依靠競賽條件來保持一致...... –
@NicolasMiari感謝您的意見。我試着多次運行這段代碼,而不是一次拋出一個異常。我每次都不幸運。我試圖找出各種可能有助於避免異常的可能性,例如塊範圍,但我無法得出任何可能準確的結論。 – Say2Manuj
你究竟在哪裏分配數組? 'arr'是零,所以你的代碼不會做任何事情 – Paulw11