多線程 ---- NSThread和線程安全

創(chuàng)建和啟動線程
  • 一個NSThread對象就代表一條線程
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run:) object:@"jack"];
[thread start];
//線程一啟動足淆,就會在線程thread中執(zhí)行self的run方法
  • 主線程相關方法
 + (NSThread *)mainThread//獲得主線程
 + (BOOL)isMainThread//是否為主線程
 - (BOOL)isMainThread//是否為主線程
  • 其他方法
  • 獲得當前線程
NSThread *current = [NSThread currentThread];
  • 線程的名字
  - (void)setName:(NSString *)name;
  - (NSString *)name;
其他創(chuàng)建線程方式
  • 創(chuàng)建線程后自動啟動線程
[NSThread detachNewThreadSelector:@selector(run:) toTarget:self withObject:@"rose"];
  • 隱式創(chuàng)建并啟動線程
 [self performSelectorInBackground:@selector(run:) withObject:@"jack"];
  • 上述兩種創(chuàng)建線程方式的優(yōu)缺點
    p 優(yōu)點:簡單快捷
    p 缺點:無法對線程進行更詳細的設置
線程的狀態(tài)
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run:) object:@"jack"];
屏幕快照 2016-06-12 下午2.36.59.png
控制線程的狀態(tài)
- (void)start;
//進入就緒狀態(tài) -> 運行狀態(tài)。當線程任務執(zhí)行完畢,自動進入死亡狀態(tài)
  • 阻塞(暫停線程)
 + (void)sleepUntilDate:(NSDate *)date;
 + (void)sleepForTimeInterval:(NSTimeInterval)ti;
//進入阻塞狀態(tài)
//注意:一旦線程停止(死亡)了巧号,就不能再次開啟任務
多線程的安全隱患
  • 資源共享
    p 一塊資源可能會被多個線程共享族奢,也就是多個線程可能會訪問同一塊資源。
    p 比如多個線程訪問同一個對象丹鸿、同一個變量越走、同一個文件

  • 當多個線程訪問同一塊資源時,很容易引發(fā)數(shù)據(jù)錯亂和數(shù)據(jù)安全問題靠欢。

  • 安全隱患示例01 - 存錢取錢

屏幕快照 2016-06-12 下午2.50.00.png
  • 安全隱患示例02 - 賣票
屏幕快照 2016-06-12 下午2.51.35.png
  • 安全隱患分析
屏幕快照 2016-06-12 下午2.52.52.png
安全隱患解決 - 互斥鎖
屏幕快照 2016-06-12 下午2.54.26.png
  • 互斥鎖使用格式
@synchronized(鎖對象){//需要鎖定的代碼}
//注意鎖定一份代碼只用1把鎖廊敌,用多把鎖是無效的
  • 互斥鎖的優(yōu)缺點
    1 優(yōu)點:能有效防止因多線程搶奪資源造成的數(shù)據(jù)安全問題
    2 缺點:需要消耗大量的CPU資源

  • 互斥鎖的使用前提:多條線程搶奪同一塊資源

  • 相關專業(yè)術語:線程同步
    p 線程同步的意思是:多條線程在同一條線上執(zhí)行(按順序的執(zhí)行任務)
    p 互斥鎖,就是使用了線程同步技術掺涛。

-互斥鎖代碼示例:

#import "ViewController.h"

@interface ViewController ()
/** 售票員01 */
@property (nonatomic, strong) NSThread *thread01;
/** 售票員02 */
@property (nonatomic, strong) NSThread *thread02;
/** 售票員03 */
@property (nonatomic, strong) NSThread *thread03;

/** 票的總數(shù) */
@property (nonatomic, assign) NSInteger ticketCount;

/** 鎖對象 */
//@property (nonatomic, strong) NSObject *locker;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
//    self.locker = [[NSObject alloc] init];
    
    self.ticketCount = 100;
    
    self.thread01 = [[NSThread alloc] initWithTarget:self selector:@selector(saleTicket) object:nil];
    self.thread01.name = @"售票員01";
    
    self.thread02 = [[NSThread alloc] initWithTarget:self selector:@selector(saleTicket) object:nil];
    self.thread02.name = @"售票員02";
    
    self.thread03 = [[NSThread alloc] initWithTarget:self selector:@selector(saleTicket) object:nil];
    self.thread03.name = @"售票員03";
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [self.thread01 start];
    [self.thread02 start];
    [self.thread03 start];
}

- (void)saleTicket
{
    while (1) {
        @synchronized(self) {
            // 先取出總數(shù)
            NSInteger count = self.ticketCount;
            if (count > 0) {
                self.ticketCount = count - 1;
                NSLog(@"%@賣了一張票庭敦,還剩下%zd張", [NSThread currentThread].name, self.ticketCount);
            } else {
                NSLog(@"票已經(jīng)賣完了");
                break;
            }
        }
    }
}

@end
原子和非原子屬性的選擇
  • nonatomic和atomic對比
    p atomic :線程安全,需要消耗大量的資源
    p nonatomic :非線程安全薪缆,是和內存小的移動設備

  • iOS開發(fā)的建議

  • 1.所有屬性都聲明為nonatomic

  • 2.盡量避免多線程搶奪同一塊資源

  • 3.盡量將加鎖秧廉、資源搶奪的業(yè)務邏輯交給服務器端處理,減小移動客戶端的壓力拣帽。

線程間通信
  • 什么叫做線程間通信
    p 在一個進程中疼电,線程往往不是孤立存在的,多個線程之間需要經(jīng)常通信减拭。

  • 線程間通信的提現(xiàn)
    p 一個線程傳遞數(shù)據(jù)給另一個線程
    p 在一個線程中執(zhí)行完特定任務后蔽豺,轉到另一個線程繼續(xù)執(zhí)行任務

  • 線程間通信常用方法

 - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(nullable id)arg waitUntilDone:(BOOL)wait
 - (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(nullable id)arg waitUntilDone:(BOOL)wait
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市拧粪,隨后出現(xiàn)的幾起案子修陡,更是在濱河造成了極大的恐慌,老刑警劉巖可霎,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件魄鸦,死亡現(xiàn)場離奇詭異,居然都是意外死亡癣朗,警方通過查閱死者的電腦和手機拾因,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來旷余,“玉大人绢记,你說我怎么就攤上這事≌裕” “怎么了蠢熄?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長炉旷。 經(jīng)常有香客問我护赊,道長惠遏,這世上最難降的妖魔是什么砾跃? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任骏啰,我火速辦了婚禮,結果婚禮上抽高,老公的妹妹穿的比我還像新娘判耕。我一直安慰自己,他們只是感情好翘骂,可當我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布壁熄。 她就那樣靜靜地躺著,像睡著了一般碳竟。 火紅的嫁衣襯著肌膚如雪草丧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天莹桅,我揣著相機與錄音昌执,去河邊找鬼。 笑死诈泼,一個胖子當著我的面吹牛懂拾,可吹牛的內容都是我干的。 我是一名探鬼主播铐达,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼岖赋,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了瓮孙?” 一聲冷哼從身側響起唐断,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎杭抠,沒想到半個月后脸甘,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡祈争,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年斤程,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片菩混。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡忿墅,死狀恐怖,靈堂內的尸體忽然破棺而出沮峡,到底是詐尸還是另有隱情疚脐,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布邢疙,位于F島的核電站棍弄,受9級特大地震影響望薄,放射性物質發(fā)生泄漏。R本人自食惡果不足惜呼畸,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一痕支、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蛮原,春花似錦卧须、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蹦漠,卻和暖如春椭员,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背笛园。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工隘击, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人喘沿。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓闸度,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蚜印。 傳聞我的和親對象是個殘疾皇子莺禁,可洞房花燭夜當晚...
    茶點故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內容

  • 一、多線程基礎 基本概念 進程進程是指在系統(tǒng)中正在運行的一個應用程序每個進程之間是獨立的窄赋,每個進程均運行在其專用且...
    AlanGe閱讀 546評論 0 0
  • 創(chuàng)建和啟動線程 一個NSThread對象就代表一條線程 創(chuàng)建哟冬、啟動線程 NSThread *thread = [[...
    JonesCxy閱讀 217評論 0 0
  • .一.進程 進程:是指在系統(tǒng)中正在運行的一個應用程序,每個進程之間是獨立的,每個進程均運行在其專用且受保護的內存空...
    IIronMan閱讀 4,486評論 1 33
  • 本文選譯自《Threading Programming Guide》忆绰。 導語 線程技術作為在單個應用程序中并發(fā)執(zhí)行...
    巧巧的二表哥閱讀 2,437評論 4 24
  • 佛珠是佛教徒用以念誦記數(shù)的隨身法具,在僧俗間的廣泛使用稚茅。本稱“念珠”起源于持念佛法僧三寶之名纸淮,是用以消除煩惱障和報...
    珠寶大課堂閱讀 453評論 0 0