Bison眼中的iOS开发多线程是这样的(二)

allluckly.cn.png

"多线程很容易突然出现“错误情况”,这是由于系统的线程调度具有一定的随机性造成的。不过,即使程序偶然出现问题,那也是由于编程不当所引起的。当使用多个线程来访问同一个数据时,很容易“偶然”出现线程安全问题。"

前面在《Bison眼中的iOS开发多线程是这样的(一)》一文中讲到多线程的优先级,接下来我们讲讲线程同步与线程通信

多线程很容易突然出现“错误情况”,这是由于系统的线程调度具有一定的随机性造成的。不过,即使程序偶然出现问题,

那也是由于编程不当所引起的。当使用多个线程来访问同一个数据时,很容易“偶然”出现线程安全问题。

关于线程安全问题,有OC的多线程支持引入了同步,使用同步的通用方法就是@synchronized修饰代码块,

@synchronized修饰的代码块可简称为同步代码块。同步代码块的语法格式如下:


@synchronized(obj){
    ...
    //此处的代码即为同步代码块
}

上面语法格式中@synchronized后面括号里的obj就是同步监视器。上面代码的含义是:

线程开始执行同步代码块之前,必须先获得对同步监视器的锁定。值得注意的是,人和时刻只能有

一个线程可以获得对同步监视器的锁定,当同步代码块执行完后,该线程会释放对同步监视器的锁定

虽然OC允许使用任何对象作为同步监视器,但想一下同步监视器的目的:阻止俩个线程对同一共享资

源进行并发访问,因此通常推荐使用可能被并发访问的共享资源充当同步监视器

线程安全的类具有如下特征:

该类的对象可以被多个线程安全的访问。

每个线程调用该对象的任意方法之后都将得到正确结果。

每个线程调用该对象的任意方法之后,该对象依然保持合理状态。

Foundation框架中很多类都是有可变和不可变俩种版本,其中不可变类总是线程安全的,因为它的

对象状态不可改变。而可变类的对象需要额外的方法来保证其线程安全。

将多个线程并发修改共享资源的临界区使用@synchronized修饰,这样即可保证任意时刻,最多只

能有一个线程进入临界区修改共享数据,从而就可以实现线程安全的类。

可变类的线程安全是以降低程序的运行效率作为代价的。为了减少线程安全所带来的负面影响,程序可

以采用如下策略:

不要对线程安全类的所有方法都进行同步,只对那些会改变竞争资源(共享资源)对方法进行同步。

如果可变类有俩种运行环境:单线程环境和多线程环境,则应该为该可变类提供俩种版本,线程不安全版本和安全版本。在单线程环境中使用线程不安全版本已保证性能,在多线程环境中使用线程安全版本。

任何线程在进入同步代码块之前,必须先获得对同步监视器的锁定,那么何时会释放对同步监视器的锁定呢?程序无法显示释放对同步监视器的锁定,线程会再如下几种情况下释放对同步监视器的锁定。

当线程的同步代码块执行结束,当前线程即将释放同步监视器。

当线程的同步代码块中遇到 goto、 return终止了该代码块、该方法的继续执行时,当前线程将会释放同步监视器。

当线程的同步代码块中出现了错误,导致该代码块异常结束时,将会释放同步监视器。典型的例子有:当程序调用NSThreadsleepXxx方法暂停线程时,线程不会释放同步监视器。

Foundation还提供了NSLock,通过显示定义同步锁对象来实现同步,在这种机制下,同步锁使用NSLock对象充当。

NSLock是控制多个线程对共享资源进行访问的工具。通常锁提供了对共享资源的独占访问,每次只能有一个线程对NSLock对象加锁,线程开始访问共享资源之前应县获得NSLock对象。

在实现线程安全的控制中,使用该NSLock对象可以显式的加锁、释放锁。下面我们来举个简单的🌰


NSLock* lock;
- (id)init
{
    self = [super init];
    if (self) {
        lock = [[NSLock alloc] init];
    }
    return self;
}

//定义需要保证线程安全的方法
- (void)Safety{
    
    [lock lock];

    //需要保证线程安全的方法
    
    [lock unlock];
}



当线程在系统内运行,线程的调度具有一定的透明度,程序通常无法准确控制线程的轮换执行,但我们可以通过一些机制来保证线程协调运行,也就是处理线程之间的通信。

对此Foundation提供了NSCondition类来处理多线程之间的通信,NSCondition实现了NSLock协议,因此也可以调用lockunlock来实现线程同步。除此之外,NSCondition可以让那些已经锁定NSCondition对象却无法继续执行的线程释放NSCondition对象,NSCondition对象也可以唤醒其他处于等待状态的线程。

NSCondition提供了如下几个方法

//改方法导致当前线程一直等待,直到其他线程调用该NSCondition的signal方法或者broadcast方法 
- (void)wait;
//用于控制等待到指定时间点,如果到了该时间点,该线程将会被自动唤醒
- (BOOL)waitUntilDate:(NSDate *)limit;
//唤醒等待的单个线程,如果有多个,则随机唤醒一个。只有当前线程放弃对该NSCondition对象的锁定后(wait方法),才可执行
- (void)signal;
//唤醒等待的所有线程
- (void)broadcast;

今天暂时写到这!

预告:(三)主讲GCD多线程!

如对你有帮助,请不要吝惜你的star和喜欢哦!

技术交流群:534926022(免费) 511040024(0.8/人付费)

推荐一款学习iOS开发的app_____|______| | 传送门

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,864评论 6 494
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,175评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,401评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,170评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,276评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,364评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,401评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,179评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,604评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,902评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,070评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,751评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,380评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,077评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,312评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,924评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,957评论 2 351

推荐阅读更多精彩内容

  • 引用自多线程编程指南应用程序里面多个线程的存在引发了多个执行线程安全访问资源的潜在问题。两个线程同时修改同一资源有...
    Mitchell阅读 1,984评论 1 7
  • 接上文iOS多线程--并行开发一 4、线程同步 说到多线程就不得不提多线程中的锁机制,多线程操作过程中往往多个线程...
    John_LS阅读 768评论 1 5
  • 该文章转自:http://blog.csdn.net/evankaka/article/details/44153...
    加来依蓝阅读 7,340评论 3 87
  • 我希望,我是让你心动的人,而不是权衡利弊后,觉得不错的人。 “你相信爱情吗?” “我相信,但我不相信我能遇到。”总...
    左郁阅读 414评论 1 3
  • 第一次接触关于理财类的书籍,是Grace向我推荐《小狗钱钱》,收到书后,我当天花了两个小时就看完了。一本语言极其简...
    Arcy_阅读 217评论 0 2