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

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(shanqingyongzhi)
➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:http://www.javashuo.com/article/p-umhqcndw-ku.html 
➤若是连接不是山青咏芝的博客园地址,则多是爬取做者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持做者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★html

目录:[Swift]通天遁地Swiftgit

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

使用锁能够防止多个线程,在访问同一数据对象时,对数据形成的破坏。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 }

因为图书销售的方法被锁保护,使变量能够安全地修改。网络

相关文章
相关标签/搜索