第一篇:线程的安全

一、资源共享

我们知道一块资源可能会被多个线程共享,也就是多个线程可能会访问同一块资源,不如多个线程访问同一个对象,同一个变量、同一个文件。当多个线程访问同一块资源时,很容易引发数据错乱和数据安全问题。

例如:我们工厂要生产零件,A生产线和B生产线每个线有1000个零件要生产,但是他们用的是同一个零件箱,那零件箱只能放1000个零件,当他们生产完之后还剩很多零件堆着,这时他们很容易产生矛盾。

还有就是一个经典的例子:卖票:

问题代码:

#import "ViewController.h"

@interface ViewController ()

//剩余的线程

@property(nonatomic,assign)int Ticket;

@property(nonatomic,strong)NSThread*thread1;

@property(nonatomic,strong)NSThread*thread2;

@property(nonatomic,strong)NSThread*thread3;

@end

@implementation ViewController

- (void)viewDidLoad

{

[super viewDidLoad];

self.view.backgroundColor=[UIColor whiteColor];

//有10张票

self.Ticket=10;

//开启多线程,模拟售票员售票

self.thread1=[[NSThread alloc]initWithTarget:self selector:@selector(sellTickets) object:nil];

_thread1.name=@"售票员A";

self.thread2=[[NSThread alloc]initWithTarget:self selector:@selector(sellTickets) object:nil];

_thread2.name=@"售票员B";

self.thread3=[[NSThread alloc]initWithTarget:self selector:@selector(sellTickets) object:nil];

_thread3.name=@"售票员C";

}

-(void)sellTickets

{

while (1) {

//1.先检查票

int count =self.Ticket;

if (count>0)

{

//暂停一段时间

[NSThread sleepForTimeInterval:0.1];

//2.票数减一

self.Ticket = count - 1;

//获取当前线程

NSThread*current=[NSThread currentThread];

NSLog(@"%@---卖了一张票,还剩%d张票",current,self.Ticket);

}else

{

//退出线程

[NSThread exit];

}

}

}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{

//开启线程

[self.thread1 start];

[self.thread2 start];

[self.thread3 start];

}

运行结果:

二、如何解决

互斥锁使用格式

@synchronized(锁对象)

注意:锁定1份代码只用1把锁,用多把锁是无效的

代码示例:

互斥锁的优点和缺点

优点:能有效防止因多线程抢夺资源造成的数据安全问题

缺点:需要消耗大量的CPU资源

互斥锁的使用前提:多线程抢夺一块资源

相关专业术语:线程同步,多条多线程按顺序地执行任务

互斥锁,就是使用了线程同步技术

三、原子和非原子属性

OC在定义属性时有nanatomic和atomic两种选择

atomic:线程安全,需要消耗大量的资源

nonatomic:非线程安全,适合内存小的设备

atomic:原子属性,为setter方法加锁(默认就是atomic)

nonatomic:非原子属性,不会为setter方法加锁

atomic加锁原理:

1 @property (assign, atomic) int age;
2
3 - (void)setAge:(int)age
4 {
5
6     @synchronized(self) {
7        _age = age;
8     }
9 }

iOS开发的建议

所有属性都声明为nonatomic

尽量避免多线程抢夺同一块资源

尽量将加锁、资源抢夺的业务逻辑交给服务器端处理,减小移动客户端的压力

				
时间: 2024-10-09 22:48:32

第一篇:线程的安全的相关文章

JDFS:一款分布式文件管理实用程序第一篇(线程池、epoll、上传、下载)

一 前言 截止目前,笔者在博客园上面已经发表了3篇关于网络下载的文章,这三篇博客实现了基于socket的http多线程远程断点下载实用程序.笔者打算在此基础上开发出一款分布式文件管理实用程序,截止目前,已经实现了 服务端/客户端 的上传.下载部分的功能逻辑.涉及到的知识点包括线程池技术.linux epoll并发技术.上传.下载等.JDFS的下载功能的逻辑部分与笔者前几篇关于JWebFileTrans(JDownload)比较类似.如果读者对socket网络下载不熟悉或者是只对下载功能感兴趣,请

SaltStack 入门到精通 - 第一篇: 安装SaltStack

实际环境的设定: 系统环境: centos6 或centos5 实验机器: 192.168.1.100 软件需求: salt 套件,及其需求环境 实验目的: 成功安装salt,并实现salt主从间通讯 特殊设置: 其它目的: 安装SaltStack(下面简称为salt) epel安装:salt安装需要epel源支持,所以在安装salt前需要先安装epel包 # centos5 下载下面rpm  wget -O    epel.rpm https://dl.fedoraproject.org/pu

秒杀多线程第一篇 多线程笔试面试题汇总 ZZ 【多线程】

http://blog.csdn.net/morewindows/article/details/7392749 系列前言 本系列是本人参加微软亚洲研究院,腾讯研究院,迅雷面试时整理的,另外也加入一些其它IT公司如百度,阿里巴巴的笔试面试题目,因此具有很强的针对性.系列中不但会详细讲解多线程同步互斥的各种“招式”,而且会进一步的讲解多线程同步互斥的“内功心法”.有了“招式”和“内功心法”,相信你也能对多线程挥洒自如,在笔试面试中顺利的秒杀多线程试题. ----------------------

HTTP -> Asp.net (第一篇)

当用户在浏览器输入一个URL地址后,浏览器会发送一个请求到服务器.这时候在服务器上第一个负责处理请求的是IIS.然后IIS再根据请求的URL扩展名将请求分发给不同的ISAPI处理. 流程如下: 1.IIS => aspnet_isapi阶段 ISAPI是一个底层的WIN32 API,开发者可以使用这些接口深入到IIS,让IIS支持各种其他处理程序.ISAPI是一个桥接口,通常用于高层次的工具与IIS之间的接驳.例如Windows下的Apache与Tomcat就是构建于ISAPI之上.ISAPI是

秒杀多线程第一篇 多线程笔试面试题汇总

版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 系列前言 本系列是本人参加微软亚洲研究院,腾讯研究院,迅雷面试时整理的,另外也加入一些其它IT公司如百度,阿里巴巴的笔试面试题目,因此具有很强的针对性.系列中不但会详细讲解多线程同步互斥的各种“招式”,而且会进一步的讲解多线程同步互斥的“内功心法”.有了“招式”和“内功心法”,相信你也能对多线程挥洒自如,在笔试面试中顺利的秒杀多线程试题. -------------------------------------华丽的分割线

Servlet 2.4 规范之第一篇:概览

      写在前面的话: 本系列是对<Java Servlet Specification Version 2.4>的完全翻译,力争但不保证完美表达出英文原文的思想内涵.如有疏漏之处,还请各位海涵并留言纠正.       SRV.1.1    Servlet是什么? Servlet是一种用于生成动态内容的Java Web组件技术,由容器(Container)负责管理其生命周期.和Java领域的其他技术一样,Servlet被编译为平台中立的class文件,然后动态的载入并运行在Web serv

iOS开发多线程篇—线程间的通信

iOS开发多线程篇—线程间的通信 一.简单说明 线程间通信:在1个进程中,线程往往不是孤立存在的,多个线程之间需要经常进行通信 线程间通信的体现 1个线程传递数据给另1个线程 在1个线程中执行完特定任务后,转到另1个线程继续执行任务 线程间通信常用方法 - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait; - (void)performSelector:(SE

并行计算复习————第一篇 并行计算硬件平台:并行计算机

并行计算复习 第一篇 并行计算硬件平台:并行计算机 Ch1 并行计算与并行计算机结构模型 1.1多核处理器与线程级并行 1.何谓多核处理器? 将功能复杂的单一核处理器划分为若干个功能相对简单的多个处理器内核,这些多处理器集中在一块芯片上,最初称为单芯片多处理器CMP,Intel公司将其商用名定为多核处理器 2.多核处理器的意义: 解决单处理器瓶颈:密集晶体管集成,功耗剧增:设计指令级并行体系结构来利用晶体管资源,但软件与硬件设计复杂 具有自己的优势:CMP设计验证周期短.开发风险成本低,相对较低

宇哥带你飞之Android多线程与异步任务--第一篇

本人工作已经一年多了,具体点说已经一年多3个月了,实习的早,过早的受到了社会的蹂躏.今年6月多份毕业了,然后就到了一个比较大的公司,具体名字就不说了,就是妹子超级超级多....在学校学的是游戏,cx之类的,但是鬼使神差的毕业后跟着同学就干上了应用,多亏了我的第一个老板--李金波,超级感谢~ 好了,废话不多说了,接下来就开启Android多线程与异步任务的学习吧,由于内容有点多,分几篇博客来和大家扯淡~ 学习Android当然就避免不了学习java,java中也有多线程还有线程之间的同步问题等等~

基于C# Winform的简易聊天程序[第一篇-两端通信]

程序简介 本聊天程序支持局域网内部客户端与服务端之间的互相通信. 原理 启动服务端后,服务端通过持续监听客户端发来的请求,一旦监听到客户端传来的信息后,两端便可以互发信息了.服务端需要绑定一个IP,用于客户端在网络中寻找并建立连接.信息发送原理:将手动输入字符串信息转换成机器可以识别的字节数组,然后调用套接字的Send()方法将字节数组发送出去.信息接收原理:调用套接字的Receive()方法,获取对端传来的字节数组,然后将其转换成人可以读懂的字符串信息. 界面设计 - 服务端 IP文本框 na