• [Swift通天遁地]四、网络和线程-(1)线程的锁和解锁


    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    ➤微信公众号:山青咏芝(shanqingyongzhi)
    ➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/
    ➤GitHub地址:https://github.com/strengthen/LeetCode
    ➤原文地址:https://www.cnblogs.com/strengthen/p/10219214.html 
    ➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
    ➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

    目录:[Swift]通天遁地Swift

    本文将演示线程的锁和解锁。

    使用锁可以防止多个线程,在访问同一数据对象时,对数据造成的破坏。

    在项目导航区,打开视图控制器的代码文件【ViewController.swift】

    现在开始编写代码,实现一个图书销售程序,并通过程序演示线程锁的使用。

     1 import UIKit
     2 
     3 class ViewController: UIViewController {
     4     
     5     //添加一个属性,作为书本总的数量
     6     var booksCount = 100
     7     //添加一个属性,作为书本已经售出的数量
     8     var soldBooksCount = 0
     9     //添加一个属性,该属性将作为线程的锁
    10     var lock : NSLock!
    11     
    12     override func viewDidLoad() {
    13         super.viewDidLoad()
    14         // Do any additional setup after loading the view, typically from a nib.
    15         
    16         //将线程锁对象进行初始化
    17         lock = NSLock()
    18         
    19         //创建第一个线程对象,并且设置该线程的坐标、选择器和数据对象等参数
    20         let salesmanA = Thread(target: self, //线程的坐标
    21                                selector: #selector(ViewController.sellBook), //选择器
    22                                object: nil)//数据对象
    23         //设置线程对象的名称
    24         salesmanA.name = "Sales A"
    25         //开始启动该线程
    26         salesmanA.start()
    27         
    28         //创建第二个线程对象,并且设置该对象的各个属性
    29         let salesmanB = Thread(target: self, //线程的坐标
    30                                selector: #selector(ViewController.sellBook), //选择器
    31                                object: nil)//数据对象
    32         //设置线程对象的名称
    33         salesmanB.name = "Sales B"
    34         //开始启动该线程
    35         salesmanB.start()
    36         
    37         //创建第三个线程对象,并且设置该对象的各个属性
    38         let salesmanC = Thread(target: self, //线程的坐标
    39                                selector: #selector(ViewController.sellBook), //选择器
    40                                object: nil)//数据对象
    41         //设置线程对象的名称
    42         salesmanC.name = "Sales C"
    43         //开始启动该线程
    44         salesmanC.start()
    45     }
    46 
    47     //添加一个方法,用来实现图书销售的动作
    48     func sellBook()
    49     {
    50         //创建一个无限循环
    51         while true
    52         {
    53             //在动作执行之前,添加一个线程锁。使该方法同时只被一个线程所访问。
    54             lock.lock()
    55             //添加一个判断语句
    56             if booksCount > 0
    57             {
    58                 //当仍有图书尚未销售时,则执行后面的代码
    59 
    60                 //添加一个休眠语句,放慢线程的执行动作,
    61                 //以方便观察线程锁的作用。
    62                 Thread.sleep(forTimeInterval: 0.01)
    63                 
    64                 //将已销售的图书的数量增加1,模拟图书销售的操作
    65                 soldBooksCount += 1
    66                 //图书销售之后,将图书总的数量减1
    67                 booksCount -= 1
    68                 //获得执行该方法的线程名称
    69                 let threadName = Thread.current.name
    70                 
    71                 //在控制台输出:
    72                 //1.线程的名称。2.已经售出的线程数量。3.剩余的图书数量。
    73                 print("Operator:(threadName), books sold:(soldBooksCount), and the remaining:(booksCount).")
    74             }
    75             else
    76             {
    77                 //否则结束并退出线程
    78                 Thread.exit()
    79             }
    80             //在方法的末尾,添加解锁语句。
    81             //解除对访问的锁定,使其他线程可以获得调用方法的权利。
    82             lock.unlock()
    83         }
    84     }
    85     
    86     override func didReceiveMemoryWarning() {
    87         super.didReceiveMemoryWarning()
    88         // Dispose of any resources that can be recreated.
    89     }
    90 }

    由于图书销售的方法被锁保护,使变量可以安全地修改。

  • 相关阅读:
    深入理解Nginx及使用Nginx实现负载均衡
    Linux内存管理之伙伴系统之伙伴系统概述
    TCP 协议如何解决粘包、半包问题
    Linux CPU亲缘性详解
    单实例
    关联容器和无序关联容器的区别
    基于范围的for循环
    vector讲一个容器的内容拷贝到另一个容器,容器的区间删除
    win32窗口添加按钮及按钮消息相应,动态显示时间
    判断是不是纯数字字符串
  • 原文地址:https://www.cnblogs.com/strengthen/p/10219214.html
Copyright © 2020-2023  润新知