iOS开发多线程篇---线程锁(线程安全)
iOS开发多线程篇---线程锁(线程安全)
琳小兮 发表于3年前
iOS开发多线程篇---线程锁(线程安全)
  • 发表于 3年前
  • 阅读 3188
  • 收藏 2
  • 点赞 1
  • 评论 1
摘要: 我们在使用多线程的时候多个线程可能会访问同一块资源,这样就很容易引发数据错乱和数据安全等等问题,所以我们需要给线程加一个线程锁。线程锁的使用格式是:@synchronized(锁对象) { // 需要锁定的代码 }锁定1份代码只用1把锁,用多把锁是无效的。
@interface BTThreadViewController ()
{
    NSThread *OneThread;//师傅一
    NSThread *TwoThread;//师傅二
    NSThread *ThreeThread;//师傅三
    int allCake;//蛋糕总数
}
@end

@implementation BTThreadViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    [self myThread];
}

-(void)myThread
{
    allCake = 10;
    
    //给每个线程起一个名字,方便下面区分
    OneThread = [[NSThread alloc] initWithTarget:self selector:@selector(SendTheCake) object:nil];
    OneThread.name = @"师傅一";
    [OneThread start];
    
    TwoThread = [[NSThread alloc] initWithTarget:self selector:@selector(SendTheCake) object:nil];
    TwoThread.name = @"师傅二";
    [TwoThread start];
    
    ThreeThread = [[NSThread alloc] initWithTarget:self selector:@selector(SendTheCake) object:nil];
    ThreeThread.name = @"师傅三";
    [ThreeThread start];
}

-(void)SendTheCake
{
    while (1) {
        //线程锁的优点:能有效防止因多线程抢夺资源造成的数据安全问题,缺点:需要消耗大量的CPU资源,线程锁的使用前提:多条线程抢夺同一块资源,相关专业术语:线程同步,多条线程按顺序地执行任务。线程锁,就是使用了线程同步技术
        @synchronized(self){
            if (allCake > 0) {
                
                //线程休眠时间
                [NSThread sleepForTimeInterval:0.002];
                
                //蛋糕个数-1
                allCake -= 1;
                //打印当前的线程和剩余蛋糕数量
                NSThread *senderThread = [NSThread currentThread];
                NSLog(@"--%@发了1个蛋糕,还剩下%d个蛋糕",senderThread,allCake);
            }
            else
            {
                //退出线程
                [NSThread exit];
            }
        }
    }
}

共有 人打赏支持
粉丝 30
博文 28
码字总数 17320
评论 (1)
天师上人
额,是不是南京交流群里的?
×
琳小兮
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: