我有一個關於Objective-C中線程安全的問題。我已經閱讀了一些其他答案,一些Apple文檔,並且仍然對此有所懷疑,所以我想我會問自己的問題。鎖定一個對象被多個線程訪問 - Objective-C
我的問題是三折:
假設我有一個數組,NSMutableArray *myAwesomeArray;
折1:
現在,糾正我,如果我錯了,但是從我的理解,使用@synchronized(myAwesomeArray){...}
將阻止兩個線程訪問相同的代碼塊。所以,基本上,如果我有這樣的:
-(void)doSomething {
@synchronized(myAwesomeArray) {
//some read/write operation on myAwesomeArray
}
}
那麼,如果兩個線程在同一時間訪問相同方法,代碼塊將是線程安全的。我猜我已經正確理解了這個部分。
折2:
,該怎麼辦,如果myAwesomeArray
正在被多個線程不同的方法來訪問? 如果我有這樣的:
- (void)readFromArrayAccessedByThreadOne {
//thread 1 reads from myAwesomeArray
}
- (void)writeToArrayAccessedByThreadTwo {
//thread 2 writes to myAwesomeArray
}
現在,這兩種方法是由兩個不同的線程在同一時間訪問。我如何確保myAwesomeArray
不會有問題?我使用類似NSLock或NSRecursiveLock的東西嗎?
折3:
現在,在上述兩種情況下,myAwesomeArray
是在存儲器中的實例變量。如果我有一個數據庫文件,我並不總是保存在內存中。每當我想執行數據庫操作時,我都會創建一個databaseManagerInstance
,並在完成後釋放它。因此,基本上,不同的類可以訪問數據庫。每個類創建自己的實例DatabaseManger
,但基本上它們都使用相同的單個數據庫文件。在這種情況下,如何確保數據不因爲競爭條件而損壞?
這將幫助我清除一些基本面。
'@ synchronize'防止其它線程訪問已被鎖定相同的變量,而不是特定的代碼塊。 –
啊。我懂了。好吧,我想還有一點我對@synchronize指令的理解。謝謝! :D – codeBearer
@codeBearer我在http://stackoverflow.com/a/15393623/412916回答了你的問題。 – Jano