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

因爲圖書銷售的方法被鎖保護,使變量能夠安全地修改。網絡

相關文章
相關標籤/搜索