有了多執行緒就有了資源競爭,當多個執行緒對同一資源進行操作時就容易出現安全隱患。
下面舉乙個賣票的例子來說明執行緒的安全隱患12
3456
78910
1112
1314
1516
1718
1920
2122
2324
2526
2728
2930
3132
3334
3536
3738
3940
4142
@inte***ce
viewcontroller ()
@property
(assign,
nonatomic
)
nsinteger
tickets;
@end
@implementation
viewcontroller
- (
void
)viewdidload
- (
void
)saletickets
else
}
}
列印結果
可以看到票的餘量是很混亂的,看下面一張圖可以比較清楚的了解為什麼會出現這種情況
如何解決?新增互斥鎖(當a執行緒對資料進行操作時(加鎖),執行緒b不能訪問當前資料,直到a對資料完成讀寫操作結束(解鎖),執行緒b才能對資料進行操作)
這樣就保證了資料的安全性;
下面是**12
3456
78910
1112
1314
1516
1718
1920
2122
2324
2526
2728
2930
3132
3334
3536
3738
3940
4142
4344
@inte***ce
viewcontroller ()
@property
(assign,
nonatomic
)
nsinteger
tickets;
@end
@implementation
viewcontroller
- (
void
)viewdidload
- (
void
)saletickets
else
}
}
}
列印結果,可以看到資料正常了;
多執行緒的安全隱患
資源共享 1塊資源可能會被多個執行緒共享,也就是多個執行緒可能會訪問同一塊資源 比如多個執行緒訪問同乙個物件 同乙個變數 同乙個檔案 當多個執行緒訪問同一塊資源時,很容易引發資料錯亂和資料安全問題 解決方法是互斥鎖 互斥鎖使用格式 synchronized 鎖物件 注意 鎖定1份 只用1把鎖,用多把...
Java多執行緒系列(二) 執行緒安全
個人主頁 tuzhenyu s page 多執行緒併發操作下可能出現記憶體不可見問題,指令重排序問題,4位元組賦值問題等,主要造成執行緒不安全的還是記憶體不可見和指令重排序 非執行緒安全出現的情況主要是多執行緒同時對乙個共享可變變數進行讀寫操作,因此可以通過以下三種方法解決非執行緒安全問題 將可變變...
java多執行緒 二 執行緒的互斥
多執行緒相對於單執行緒而言,大大的提高了硬體cpu的使用率,提高了處理的速度。任何事物帶來的都是兩面性的,多執行緒為我們帶來效能提高的同時也帶來了許多的安全性問題。說互斥之前,先說一下什麼是互斥,舉個列子,一天去atm機取錢,如果沒有互斥的話,你正取著錢突然有個人衝進來把你的錢搶走了。這時候你想,要...