




下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
【移動應用開發(fā)技術】iOS使用多線程提高數(shù)據(jù)并發(fā)訪問之七
活躍性活躍性是指好的事情最終會發(fā)生。例如,如果你代碼的目標是確保你能夠持續(xù)從數(shù)組中push和pop對象,問題是這個過程是否能夠永遠工作。使用鎖帶來的問題是鎖會引起系統(tǒng)中所有線程一直等待--換句話說,就是死鎖。如果你能保證你應用的活躍性,那么死鎖應該永遠都不會發(fā)生。問題想象你有兩個線程:A和B。在Astart之前,A一直等待B結束。但是,在線程B繼續(xù)運行之前,B一直等待線程A結束。對于一個實際的例子,你可以在Listing6-7中查看它的代碼。注意push和pop線程被同一對象鎖住,即lockedObj。圖6-7顯示了這兩個線程是如何在同一個對象上鎖住,并永遠的互相等待。在新的例子中你可以看到,pop線程一直在while循環(huán)上等待,因為storages數(shù)組的大小為0。同時push線程不能往數(shù)組中添加對象,因為代碼被對象lockedObj鎖住了。push線程現(xiàn)在必須等待pop線程執(zhí)行完,然后把鎖歸還給lockedObj對象。因此,這兩個線程停止,然后永遠的等待對方。這里有一些死鎖問題的解決辦法。如果你的代碼發(fā)生了死鎖,你不能再使用@synchronized(lockedObj),因為這樣直接使用是不能避免死鎖的。NSLock:你可以使用它來保護并發(fā)訪問的代碼塊,就像使用@synchronized(obj)那樣,但是當這部分代碼lock和unlock時,你能夠控制它。NSCondition:這對于生產者和消費者模式是非常有用的,就像前面顯示的push和pop這個例子。NSLock解決辦法你可以有兩種使用方式,lock或tryLock。使用lock的方法,這個方法不能在獲取鎖,它會停止,然后等待直到它獲取到鎖。使用tryLock,如果方法返回NO,意味著鎖已經被其他線程占有,調用的線程不能獲取它。它已經測試了,如果獲取到鎖就繼續(xù)執(zhí)行。如果你沒有獲取到鎖,一切正常,線程會繼續(xù)執(zhí)行其他沒有使用鎖的代碼。NSCondition解決辦法使用NSLock,你會看到通過使用[testLocklock]來獲取一個鎖;你不能停止或掛起你的線程來等待一些條件。你唯一能做的就是繼續(xù)執(zhí)行直到你釋放鎖,這樣其他線程才能獲取鎖執(zhí)行。再看看push,pop這個例子。讓線程不停的運行檢查數(shù)組是否有數(shù)據(jù),效率是不高的。在循環(huán)中,如果線程發(fā)現(xiàn)數(shù)組中沒有數(shù)據(jù),它應該停止然后等待數(shù)組有數(shù)據(jù)了,就把它給取出來。這種方法的好處是你能夠掛起你的線程,而不會浪費系統(tǒng)的資源。為了讓一個線程停止,等待,還有同時返回一個鎖,你需要使用NSCondition。Listing6-8演示了如何使用NSCondition來執(zhí)行push,pop這個例子。還有其他的鎖機制,如NSRecursiveLock和NSConditionLock,但是使用NSLock和NSCondition在大部分情況下就足夠了。對于線程,你應該總是簡單明了,因為多線程會在你的代碼中引入不確定的bug。注意:NSRecursiveLock是非常有用的,如果你有一個線程想要多次獲取一個鎖,而又不會發(fā)生死鎖的話。NSRecursiveLock依然會阻塞其他線程來訪問代碼塊。死鎖使用鎖可能會導致死鎖的發(fā)生。死鎖就像前面介紹的那樣,但是更多的情況是,有兩個或多個鎖時,然后線程之間相互等待。圖6-8演示了線程1獲取object1對象鎖和線程2獲取object2對象鎖的解決辦法。然后線程1想要獲取object2的鎖,但是必須等待線程2釋放這個鎖。同時,線程2想要獲取object1的鎖,但是必須等待線程1釋放這個鎖。正如你看到的,兩個線程互相等待,沒有一個能繼續(xù)運行。有一些方法能夠解決死鎖問題,比如reorderingthreads;minimizelocking;abiggerlock;tryLock;timeoutforlocking。這些機制都不難實現(xiàn);下面的這些圖能夠幫助你理解他們是如何工作的。在圖6-9中,最簡單的方式就是對線程重排序,然后順序鎖定,這樣只有當一個使用lock2的線程結束時,其他線程才能獲取鎖,然后繼續(xù)執(zhí)行。但是,如果你的方法結構是固定的,有一些代碼是屬于第三方庫,很難重排序鎖或修改代碼。接下里的一種方法是只有你確實需要鎖住的那部分才嘗試鎖住。這中方法使的鎖住的部分最小,如圖6-10.如果有代碼或想把你不需要鎖住的代碼單獨分離出來,這種方式是很容易實現(xiàn)的。注意它會使你的代碼變得更復雜。另外一種方法是,在其他鎖上實現(xiàn)另外一個更大的鎖。這允許其他線程嘗試同時訪問同樣的鎖。例如,在圖6-11中,由于一個新的更大的鎖,線程2現(xiàn)在必須等待線程1完成,在它能獲取其他鎖或運行必要的代碼之前。在正常的代碼中,如果能夠從更小的鎖中移除,用更大的鎖取代,你應該這樣做,當它能夠減少代碼的復雜性時。這種機制通常使用在,當你需要在庫(你不能或不想修改庫中的代碼)中防止死鎖時。你應該嘗試使用tryLock。使用tryLock,如果一個線程不能獲取到鎖,它不會停止和等待。線程能夠繼續(xù)執(zhí)行線程中的其他代碼。這是一個使用tryLock的例子:我介紹的最后一種方法是使用超時,盡管還有很多其他的方法來防止死鎖。在objective-c中,你可以指定線程來等待,直到你能獲取到鎖或需要等待結束的時間。使用lockBeforeDate
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 業(yè)務外包合作協(xié)議書范本
- 公司技術服務合同范本
- 專利技術合作開發(fā)協(xié)議書范本
- 政府購買服務協(xié)議書范本
- 咖啡廳裝飾項目管理合同
- 二零二五年度綜合辦公樓租賃服務協(xié)議范本
- 教育機構合同管理流程改進措施
- 2025年離婚協(xié)議書的法律效力
- 班主任如何培養(yǎng)學生的領導能力-心得體會
- 紡織行業(yè)檢驗科室質量控制流程標準
- 廣西壯族自治區(qū)柳州市2025年中考物理模擬考試卷三套附答案
- 2024中國糖果、巧克力制造市場前景及投資研究報告
- 第11課《山地回憶》說課稿 2024-2025學年統(tǒng)編版語文七年級下冊
- 2023年H3CNE題庫附答案
- 2024年首都醫(yī)科大學附屬北京安定醫(yī)院招聘筆試真題
- 老舊小區(qū)改造項目施工組織設計方案
- 【招商手冊】杭州ICON CENTER 社交娛樂中心年輕人潮流消費創(chuàng)新實驗
- AI一體化智慧校園建設方案中學版
- 2025年國家稅務總局遼寧省稅務局系統(tǒng)招聘事業(yè)單位工作人員管理單位筆試遴選500模擬題附帶答案詳解
- 2024年思想道德與政治考試題庫 (單選、多選)
- 《中國成人白內障摘除手術指南(2023年)》解讀
評論
0/150
提交評論