[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 }

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

原文地址:https://www.cnblogs.com/strengthen/p/10219214.html