OC-多线程安全隐患及一般解决办法

1.多线程的安全隐患
1.1>一块资源可能被多个线程共享,也就是多个线程可能会访问同一块资源,如多个线程访问同一个对象,变量,文件等
当多个线程访问同一块资源时,很容易引发数据错乱和数据安全问题
1.2>安全隐患示意图:

1.3>安全隐患的解决办法:互拆锁

1.4>互斥锁的使用格式
@synchronized(锁对象){

  //需要锁定的代码

}
注意:锁定1份代码只用1把锁,用多把锁是无效的
例如:
- (void)saleTicket
{
    while (1) {
        @synchronized(self) { // 加锁(只能用一把锁)
            // 1.先检查票数
            int count = self.leftTicketsCount;
            if (count > 0) {
                // 2.票数 - 1
                self.leftTicketsCount = count - 1;
                
                NSThread *current = [NSThread currentThread];
                NSLog(@"%@ 卖了一张票, 剩余%d张票", current.name, self.leftTicketsCount);
            } else {
                // 退出线程
                [NSThread exit];
            }
        } // 解锁
    }
}

1.6>互斥锁的优缺点
优点:能有效防止因多线程抢夺资源造成的数据安全问题
缺点:需要消耗大量的CPU资源
使用前提:多条线程抢夺同一块资源
相关专业术语:线程同步
线程同步的意思是:多条线程按顺序地执行任务
互斥锁,就是使用了线程同步技术

OC-多线程安全隐患及一般解决办法

时间: 2024-10-16 05:44:15

OC-多线程安全隐患及一般解决办法的相关文章

【易语言】多线程程序崩溃 线程泄露解决办法

最近在写多线程一采集程序时遇到了程序崩溃自动关闭的显现,在网上查了下原因和解决方法,这里记录下,以备后用. 一般出现这种情况多在生成了程序后,调试时候数据不太多一般察觉不到.其原因是多线程对于双核CPU亲和性上的问题.解救方法如下: 先加入DLL: 1 2 3 4 5 6 7 8 9 10 11 12 13 .版本 2       .DLL命令 SetProcessAffinityMask, 整数型, , , 公开, 设置CPU亲和性 进程句柄 返回CPU号     .参数 hProcess, 

HBase 高性能获取数据 - 多线程批量式解决办法

在前篇博客里已经讲述了通过一个自定义 HBase Filter来获取数据的办法,在末尾指出此办法的性能是不能满足应用要求的,很显然对于如此成熟的HBase来说,高性能获取数据应该不是问题.下面首先简单介绍了搜索引擎的性能,然后详细说明了HBase与MySQL的性能对比,这里的数据都是经过实际的测试获得的.最后,给出了采用多线程批量从HBase中取数据的方案,此方案经过测试要比通过自定义Filter的方式性能高出很多. Solr和HBase专辑 1.“关于Solr的使用总结的心得体会”(http:

java多线程使用HibernateSession 时报 No session 的解决办法(转)

服务端新开多线程使用HibernateSession 杜绝No session 新起的线程需要绑定Hibernate session,才能在新线程中使用事务和延迟加载等功能,否则会曝出no session异常: 解决办法: [java] view plaincopy new Runnable() { @Override public void run() { //                  ----------绑定session到当前线程------------ SessionFacto

OC中运行出错( Unknown class <XXX> in InterfaceBuilder file.) 解决办法

做一个课堂练习,单个view的登陆窗口,一直很顺利,突然编译运行出错,所有的空间不显示.查了很久,又问了培训的老师才搞定,特此记录解决办法. Unknown class <XXX>  in InterfaceBuilder file. 现象: link报错, Unknown class  <XXClass>  in Interface Builder file., 而XXClass确实存在而且没有任何问题 参见: http://stackoverflow.com/questions

Xcode常见报错解决办法

这里总结了几个常见的Xcode报错以及解决办法,希望对大家学习Xcodehttp://www.maiziedu.com/course/234/有所帮助. 1. 死存储问题 CocoaChina CocoaChina CocoaChina 这个问题上篇文章提到过,之所以重新罗列出来,是因为这个问题也挺常见的.导致这个问题的原因是,当我们对某个对象直接赋值之后,如果包含这个对象的方法立马就结束了,那么这个对象就会被自动释放,但是我们本身根本还没有用到它,所以就形成了一个死存储代码,这个赋值语句其实也

项目中遇到的某些问题及解决办法(一)

简介 该博文记录了一些平时在工作中遇到的问题及解决办法,某些问题有解决办法,某些问题暂时没有解决办法,如果有大神知道的,请多多指点. 如果某些问题有更好的解决办法,也请指教. 正文 1.在一个方法中用泛型操作两个不同的类型(Type). 难点:需要实现一个方法,进入参数一个泛型,返回信息一个泛型.但是一个方法中泛型只支持一种类型. 解决办法:将进入和返回放在一个类型中,用特性将进入参数和返回参数区分开. 2.微信三方登录,需要在PC桌面应用端+API服务实现. 难点:微信官网只提供了网页三方登录

iOS9 HTTP 不能正常使用的解决办法

今天升级Xcode 7.0 bata发现网络访问失败. 输出错误信息 The resource could not be loaded because the App Transport Security policy requires the use of a secure connection. Google后查证,iOS9引入了新特性App Transport Security (ATS).详情:App Transport Security (ATS) 新特性要求App内访问的网络必须使用

HBase 高性能加入数据 - 按批多“粮仓”式解决办法

摘要:如何从HBase中的海量数据中,以很快的速度的获取大批量数据,这一议题已经在<HBase 高性能获取数据>(http://www.cnblogs.com/wgp13x/p/4245182.html)一文中给出了解决办法.那么,如何向HBase中高性能的插入数据呢?经研究表明,光是批量写入也还是不行.网上没有现成的方法.本文针对这一问题,给出了一个解决方案.它采用了多线程按批“多粮仓”的方式,经过验证,能较好的达到高速度的效果. 关键词:hbase, 高性能, 多线?程, 算法 解决问题:

vs2008调用opencv2.4.9的imread()函数失败解决办法

这两天在看opencv的C++接口函数,刚开始就出现问题: 一个简单的显示图像的程序,就是运行不成功: #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <string> using std::string; using namespace cv; int main() { string str="E:\\test\\LENA.BMP";