博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ios 线程笔记(一)
阅读量:1523 次
发布时间:2019-04-21

本文共 1412 字,大约阅读时间需要 4 分钟。

      每个程序都至少有个一主线程,在没有显示的创建另一个线程的情况下,主线程从主函数开始执行然后负责执行剩下的应用代码。你可以把线程想成指令按顺序执行的应用的一行代码的执行。创建另外一个线程时,实际上在应用中就会有两个并发运行的独立线程。在单核的极其上运行,线程看起来是并发运行,但实际上它们会得到CPU分配的不同时间片段。在多核机器上就有可能是同时执行的。

     当两个线程并行执行时,有可能两个线程在同一时间访问试图访问相同的内存块,若这样便会导致程序出现错误,称作不安全的线程状态。所以必须防止一个线程在同一时间访问另一个线程正在访问的内存块,常用的方法是互斥锁(lock)和使用@synchronize关键字。

(一)NSLOCK

1.OC Foundation框架提供了两种主要的互斥锁。第一种是简单的NSLOCK类。NSLOCK表示一种可以实例化然后可以在写入特定变量或者内存位置时进行锁定的简单互斥体。锁定NSLOCK对象会阻塞线程直至解锁。这样锁定的NSLOCK对象就可以在第一个线程访问结束前阻止其他线程对数据的访问。

2.第二种方法:-lockBeforeDate阻塞线程一段时间直至到指定时间。

NSLOCK的最大问题就是如果错误的尝试锁一个已经被锁在线程锁住的锁,结果就会发生“死锁”。因为尝试锁定该锁会导致阻塞当前线程,你要等待前一个锁被解锁,但是前一个锁永远不可能被解锁,因为已被后一个锁住。可以用NSResursiveLock解决,其作用就是记录锁定他的线程,若线程再次尝试锁定,就会立刻返回。

(二)@synchronize关键字

@synchronized 该指令提供一个包括了特定作用域和变量参数的内置的底层互斥锁机制。意味着其可以为一个特定变量指定锁并让该锁在特定的代码域存在。

-(void)setSomeVar:(id)inValue

{

    [inValue retain];

    @synchronized(someVar)

    {

        id originalValue = someVar;

        someVar = inValue;

        [originalValue release];

    }

}

通常@synchronized指令和self变量一起使用来指定整个对象都在@synchronized块的作用域中被锁定

-(void)setSomeVar:(id)inValue

{

    [inValue retain];

    @synchronized(self)

    {

        id originalValue = someVar;

        someVar = inValue;

        [originalValue release];

    }

}

@synchronized的优点就是因为它指定了锁的作用域,如果发生异常情况导致其退出该作用域,锁就会释放。

注:

1.在使用线程的应用中要小心使用通知,因为通知可以发布在它们的线程上发送,这就意味着如果从后台线程发送通知来更新GUI组件,就有可能出现线程安全问题。

2.不可变的Foudation类,如NSString,NSDictionary,NSSet等,由于创建后无法修改因此也自然被认定是线程安全的。但是存储它们的变量则不会,因此在修改过程中要通过锁保护。

 

转载于:https://www.cnblogs.com/xcy617/archive/2013/01/23/2873240.html

你可能感兴趣的文章
浅谈使用单元素的枚举类型实现单例模式
查看>>
Java 利用枚举实现单例模式
查看>>
Java 动态代理作用是什么?
查看>>
Java动态代理机制详解(JDK 和CGLIB,Javassist,ASM) (清晰,浅显)
查看>>
三种线程安全的单例模式
查看>>
Spring AOP 和 动态代理技术
查看>>
从 volatile 说起,可见性和有序性是什么
查看>>
如何开始接手一个项目
查看>>
Netty 5用户指南
查看>>
Java实现简单的RPC框架
查看>>
一个用消息队列 的人,不知道为啥用 MQ,这就有点尴尬
查看>>
从零手写RPC
查看>>
高并发和多线程的关系
查看>>
Java并发与多线程
查看>>
对于多线程程序,单核cpu与多核cpu是怎么工作的
查看>>
多线程和CPU的关系
查看>>
认识cpu、核与线程
查看>>
关于Java健壮性的一些思考与实践!
查看>>
如何避免自己写的代码成为别人眼中的一坨屎!
查看>>
Postman 安装及使用入门教程
查看>>