多线程 线程同步问题
// DYFViewController.m
// 623-05-线程同步问题
//
// Created by dyf on 14-6-23.
// Copyright (c) 2014年 ___FULLUSERNAME___. All rights reserved.
//
#import "DYFViewController.h"
@interface
DYFViewController ()
@property
(
nonatomic
, assign)
int
leftCount;
@property
(
nonatomic
, strong)
NSThread
*thread0;
@property
(
nonatomic
, strong)
NSThread
*thread1;
@property
(
nonatomic
, strong)
NSThread
*thread2;
@end
@implementation
DYFViewController
- (
void
)viewDidLoad
{
[
super
viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
// 默认有100张
self
.leftCount = 100;
// 开启多条线程同时卖票
self
.thread0 = [[
NSThread
alloc] initWithTarget:
self
selector:
@selector
(saleTicket) object:@
"000"
];
self
.thread0.name = @
"0000"
;
// 优先级
self
.thread0.threadPriority = 1.0;
self
.thread1 = [[
NSThread
alloc] initWithTarget:
self
selector:
@selector
(saleTicket) object:@
"000"
];
self
.thread1.name = @
"1111"
;
self
.thread1.threadPriority = 0.0;
self
.thread2 = [[
NSThread
alloc] initWithTarget:
self
selector:
@selector
(saleTicket) object:@
"000"
];
self
.thread2.name = @
"2222"
;
self
.thread2.threadPriority = 0.0;
}
/**
* 卖票
*/
- (
void
)saleTicket
{
// NSLock *lock = [[NSLock alloc] init];
// lock.tryLock
// lock.lock
while
(1) {
@synchronized
(
self
){
// 开始枷锁
// 1.先检查票数
int
count = [
self
leftCount];
if
(count > 0) {
// 票数 - 1
[
self
setLeftCount:(count - 1)];
// 暂停
[
NSThread
sleepForTimeInterval:0.0004];
NSThread
*currentT = [
NSThread
currentThread];
NSLog
(@
"%@,-------%d"
, currentT.name,
self
.leftCount);
}
else
{
// 退出线程
[
NSThread
exit];
}
}
// 解锁
}
}
- (
void
)touchesBegan:(
NSSet
*)touches withEvent:(UIEvent *)event
{
[
self
.thread0 start];
[
self
.thread1 start];
[
self
.thread2 start];
}
@end
小结:
--------------线程的安全问题(多线程的安全隐患)-------
1.资源共享
·一块资源可能会被多个线程共享,即多个线程可能会访问同一块资源
·比如多个线程访问同一个对象,同一个变量、同一个文件
2.当多个线程访问同一块资源时,很容易引发数据错乱和数据安全问题
3.实例
eg。1 存钱取钱
eg。2 卖票
-----------------安全隐患解决-互斥锁-----
1.格式
@synchronized(锁对象)
{// 需要锁定的代码
}
注意:锁定一份代码只能用1把锁,用多把锁是无效的
2.优缺点
·优点:能有效防止多线程抢夺资源造成的安全问题
·缺点:需要消耗大量的cpu资源
3.互斥锁的使用前提:多条线程抢夺同一块资源
4.相关术语:线程同步
·means:多条线程按顺序的执行任务
·互斥锁就是使用了线程同步技术