★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公衆號:山青詠芝(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 }
因爲圖書銷售的方法被鎖保護,使變量能夠安全地修改。網絡