[Swift通天遁地]四、网络和线程-(1)线程的锁和解锁
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(shanqingyongzhi)
➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/)
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:https://www.cnblogs.com/strengthen/p/10219214.html
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
本文将演示线程的锁和解锁。
使用锁可以防止多个线程,在访问同一数据对象时,对数据造成的破坏。
在项目导航区,打开视图控制器的代码文件【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 }
由于图书销售的方法被锁保护,使变量可以安全地修改。