欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

談?wù)刬OS中的幾種鎖

 更新時(shí)間:2016年11月05日 17:17:01   作者:Kakarotto-卡卡羅特  
這篇文章主要介紹了談?wù)刬OS中的幾種鎖,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。

1 前言

近日工作不是太忙,剛好有時(shí)間了解一些其他東西,本來(lái)打算今天上午去體檢,但是看看天氣還是明天再去吧,也有很大一個(gè)原因:就是周六沒(méi)有預(yù)約上!閑話少說(shuō),這里簡(jiǎn)單對(duì)鎖來(lái)個(gè)簡(jiǎn)單介紹分享。

2 目錄

  1. 第一部分:什么是鎖
  2. 第二部分:鎖的分類(lèi)
  3. 第三部分:鎖的作用
  4. 第四部分:iOS中鎖的實(shí)現(xiàn)

第一部分:什么是鎖

從小就知道鎖,就是家里門(mén)上的那個(gè)鎖,用來(lái)防止盜竊的鎖。它還有鑰匙,用于開(kāi)鎖。不過(guò)這里的鎖,并不是小時(shí)候認(rèn)知的鎖,而是站在程序員的角度的鎖。這里我就按照我的理解來(lái)介紹一下鎖。

在計(jì)算機(jī)科學(xué)中,鎖是一種同步機(jī)制,用于在存在多線程的環(huán)境中實(shí)施對(duì)資源的訪問(wèn)限制。你可以理解成它用于排除并發(fā)的一種策略。看例子

if (lock == 0) {
lock = myPID;
}

上面這段代碼并不能保證這個(gè)任務(wù)有個(gè)鎖,因此它可以在同一時(shí)間被多個(gè)任務(wù)執(zhí)行。這個(gè)時(shí)候就有可能多個(gè)任務(wù)都檢測(cè)到lock是空閑的,因此兩個(gè)或者多個(gè)任務(wù)都將嘗試設(shè)置lock,而不知道其他的任務(wù)也在嘗試設(shè)置lock。這個(gè)時(shí)候就會(huì)出問(wèn)題了。
再看看這段代碼:

class Acccount {
long val = 0; //這里不可在其他方法修改,只能通過(guò)add/minus修改
object thisLock = new object();
public void add(const long x) {
lock(thisLock) {
  val +=x;
}
}
public void minus(const long x) {
lock(thisLock) {
  val -=x;
  }
}
}

這樣就能防止多個(gè)任務(wù)去修改val了,(這里注意,如果val是public的,那個(gè)也會(huì)導(dǎo)致一些問(wèn)題)。

第二部分:鎖的分類(lèi)

鎖根據(jù)不同的性質(zhì)可以分成不同的類(lèi)。

在WiKiPedia介紹中,一般的鎖都是建議鎖,也就四每個(gè)任務(wù)去訪問(wèn)公共資源的時(shí)候,都需要取得鎖的資訊,再根據(jù)鎖資訊來(lái)確定是否可以存取。若存取對(duì)應(yīng)資訊,鎖的狀態(tài)會(huì)改變?yōu)殒i定,因此其他線程不會(huì)訪問(wèn)該資源,當(dāng)結(jié)束訪問(wèn)時(shí),鎖會(huì)釋放,允許其他任務(wù)訪問(wèn)。有些系統(tǒng)有強(qiáng)制鎖,若未經(jīng)授權(quán)的鎖訪問(wèn)鎖定的資料,在訪問(wèn)時(shí)就會(huì)產(chǎn)生異常。
在iOS中,鎖分為遞歸鎖、條件鎖、分布式鎖、一般鎖(這里是看著NSLock類(lèi)里面的分類(lèi)劃分的)。
對(duì)于數(shù)據(jù)庫(kù)的鎖分類(lèi):

分類(lèi)方式 分類(lèi)
按鎖的粒度劃分 表級(jí)鎖、行級(jí)鎖、頁(yè)級(jí)鎖
按鎖的級(jí)別劃分 共享鎖、排他鎖
按加鎖方式劃分 自動(dòng)鎖、顯示鎖
按鎖的使用方式劃分 樂(lè)觀鎖、悲觀鎖
按操作劃分 DML鎖、DDL鎖

這里就不在詳細(xì)介紹了,感興趣的大家可以自己查閱相關(guān)資料。

第三部分:鎖的作用

這個(gè)比較通俗來(lái)講:就是為了防止在多線程(多任務(wù))的情況下對(duì)共享資源(臨界資源)的臟讀或者臟寫(xiě)。也可以理解為:執(zhí)行多線程時(shí)用于強(qiáng)行限制資源訪問(wèn)的同步機(jī)制,即并發(fā)控制中保證互斥的要求。

第四部分:iOS中鎖的實(shí)現(xiàn)

先看看iOS中NSLock類(lèi)的.h文件。這里就不在寫(xiě)上來(lái)了。從代碼中可以看出,該類(lèi)分成了幾個(gè)子類(lèi):NSLock、NSConditionLock、NSRecursiveLock以及NSCondition。然后有一個(gè)NSLocking的協(xié)議:

@protocol NSLocking
- (void)lock;
- (void)unlock;
@end

這幾個(gè)子類(lèi)都遵循了NSLock的協(xié)議,這里簡(jiǎn)單介紹一下其中的幾個(gè)方法:

對(duì)于tryLock方法,嘗試獲取一個(gè)鎖,并且立刻返回Bool值,YES表示獲取了鎖,NO表示沒(méi)有獲取鎖失敗。 lockBeforeDate:方法,在某個(gè)時(shí)刻之前獲取鎖,如果獲取成功,則返回YES,NO表示獲取鎖失敗。接下來(lái)就讓我們看一下iOS中實(shí)現(xiàn)鎖的方式:

方式1 使用NSLock類(lèi)

- (void)nslockDemo {
  NSLock *myLock = [[NSLock alloc] init];
  _testLock = [[TestLock alloc] init];
  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    [myLock lock];
    [_testLock method1];
    sleep(5);
    [myLock unlock];
    if ([myLock tryLock]) {
      NSLog(@"可以獲得鎖");
    }else {
      NSLog(@"不可以獲得所");
    }
  });
  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    sleep(1);
    if ([myLock tryLock]) {
      NSLog(@"---可以獲得鎖");
    }else {
      NSLog(@"----不可以獲得所");
    }
    [myLock lock];
    [_testLock method2];
    [myLock unlock];
  });
}

方式2 使用@synchorize

- (void)synchronizeDemo {
  _testLock = [[TestLock alloc] init];
  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    @synchronized (_testLock) {
      [_testLock method1];
      sleep(5);
    }
  });
  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    sleep(1);
    @synchronized (_testLock) {
      
      [_testLock method2];
    }
  });
}

對(duì)于synchorize指令中使用的testLock為該鎖標(biāo)示,只有標(biāo)示相同的時(shí)候才滿(mǎn)足鎖的效果。它的優(yōu)點(diǎn)是不用顯式地創(chuàng)建鎖,便可以實(shí)現(xiàn)鎖的機(jī)制。但是它會(huì)隱式地添加異常處理程序來(lái)保護(hù)代碼,該程序在拋出異常的時(shí)候自動(dòng)釋放鎖。

方式3 使用gcd

- (void)gcdDemo {
  _testLock = [[TestLock alloc] init];
  dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);
  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    [_testLock method1];
    sleep(5);
    dispatch_semaphore_signal(semaphore);
  });
  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    sleep(1);
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    [_testLock method2];
    dispatch_semaphore_signal(semaphore);
  });

}

方式4 使用phtread

- (void)pthreadDemo {
  _testLock = [[TestLock alloc] init];
  
  __block pthread_mutex_t mutex;
  pthread_mutex_init(&mutex, NULL);
  
  //線程1
  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    pthread_mutex_lock(&mutex);
    [_testLock method1];
    sleep(5);
    pthread_mutex_unlock(&mutex);
  });
  
  //線程2
  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    sleep(1);
    pthread_mutex_lock(&mutex);
    [_testLock method2];
    pthread_mutex_unlock(&mutex);
  });
}

pthread_mutex_t定義在pthread.h,所以記得#include。

3 性能對(duì)比

這里簡(jiǎn)單寫(xiě)一個(gè)小程序來(lái)進(jìn)行四種方式的性能對(duì)比,這里再固定次數(shù)內(nèi)進(jìn)行了加鎖解鎖,然后輸出用時(shí),結(jié)果如下(測(cè)試1、2執(zhí)行次數(shù)不一樣:測(cè)試1 < 測(cè)試2):

測(cè)試1

2016-11-05 15:27:52.595 LockDemo[4394:202297] NSLock times:0.871843
2016-11-05 15:27:56.335 LockDemo[4394:202297] synthorize times:3.738939
2016-11-05 15:27:56.691 LockDemo[4394:202297] gcd times:0.355344
2016-11-05 15:27:57.328 LockDemo[4394:202297] pthread times:0.636815
2016-11-05 15:27:57.559 LockDemo[4394:202297] OSSPinLock times:0.231013
2016-11-05 15:27:57.910 LockDemo[4394:202297] os_unfair_lock times:0.350615

測(cè)試2

2016-11-05 15:30:54.123 LockDemo[4454:205180] NSLock times:1.908103
2016-11-05 15:31:02.112 LockDemo[4454:205180] synthorize times:7.988547
2016-11-05 15:31:02.905 LockDemo[4454:205180] gcd times:0.792113
2016-11-05 15:31:04.372 LockDemo[4454:205180] pthread times:1.466987
2016-11-05 15:31:04.870 LockDemo[4454:205180] OSSPinLock times:0.497487
2016-11-05 15:31:05.637 LockDemo[4454:205180] os_unfair_lock times:0.767569

這里還測(cè)試了OSSPinLock(此類(lèi)已經(jīng)被os_unfair_lock所替代)。結(jié)果如下:

synthorize > NSLock > pthread > gcd > os_unfair_lock >OSSPinLock

這里:

synthorize內(nèi)部會(huì)添加異常處理,所以耗時(shí)。

pthread_mutex底層API,處理能力不錯(cuò)。

gcd系統(tǒng)封裝的C代碼效果比pthread好。

4 總結(jié)

簡(jiǎn)單就介紹這么多。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • iOS 中根據(jù)屏幕寬度自適應(yīng)分布按鈕的實(shí)例代碼

    iOS 中根據(jù)屏幕寬度自適應(yīng)分布按鈕的實(shí)例代碼

    這篇文章主要介紹了iOS 中根據(jù)屏幕寬度自適應(yīng)分布按鈕的實(shí)例代碼,本文給大家分享兩種方式,代碼簡(jiǎn)單易懂,需要的朋友可以參考下
    2016-11-11
  • IOS開(kāi)發(fā)代碼分享之用nstimer實(shí)現(xiàn)倒計(jì)時(shí)功能

    IOS開(kāi)發(fā)代碼分享之用nstimer實(shí)現(xiàn)倒計(jì)時(shí)功能

    在制作IOS項(xiàng)目中,我們經(jīng)常要用到倒計(jì)時(shí)功能,今天就分享下使用nstimer實(shí)現(xiàn)的倒計(jì)時(shí)功能的代碼,希望對(duì)大家能有所幫助
    2014-09-09
  • iOS實(shí)現(xiàn)列表與網(wǎng)格兩種視圖的相互切換

    iOS實(shí)現(xiàn)列表與網(wǎng)格兩種視圖的相互切換

    相信大家應(yīng)該也都發(fā)現(xiàn)了,在現(xiàn)在很多的電商app中,都會(huì)有列表視圖和網(wǎng)格兩種視圖的相互切換。例如京東和淘寶。這樣更利于提高用戶(hù)的體驗(yàn)度,所以這篇文章小編就是大家分享下利用iOS實(shí)現(xiàn)列表與網(wǎng)格兩種視圖相互切換的方法,文中介紹的很詳細(xì),感興趣的下面來(lái)一起看看吧。
    2016-10-10
  • 2016 cocoapods的安裝和使用方法以及版本升級(jí)遇到的問(wèn)題

    2016 cocoapods的安裝和使用方法以及版本升級(jí)遇到的問(wèn)題

    CocoaPods是一個(gè)負(fù)責(zé)管理iOS項(xiàng)目中第三方開(kāi)源庫(kù)的工具,通過(guò)CocoaPods,我們可以將第三方的依賴(lài)庫(kù)統(tǒng)一管理起來(lái),配置和更新只需要通過(guò)簡(jiǎn)單的幾行命令即可完成,需要的朋友可以參考下
    2016-09-09
  • iOS開(kāi)發(fā)中使用UIWebView 屏蔽 alert警告框

    iOS開(kāi)發(fā)中使用UIWebView 屏蔽 alert警告框

    這篇文章主要介紹了iOS開(kāi)發(fā)中使用UIWebView 屏蔽 alert警告框的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-11-11
  • iOS 設(shè)置狀態(tài)欄的背景顏色方法

    iOS 設(shè)置狀態(tài)欄的背景顏色方法

    下面小編就為大家?guī)?lái)一篇iOS 設(shè)置狀態(tài)欄的背景顏色方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-04-04
  • IOS中各種手勢(shì)操作實(shí)例代碼

    IOS中各種手勢(shì)操作實(shí)例代碼

    IOS中手勢(shì)操作一般是 UIGestureRecognizer 類(lèi)的幾個(gè)手勢(shì)子類(lèi)去實(shí)現(xiàn),一般我們用到的手勢(shì)就這么5種,具體哪幾種大家通過(guò)本文學(xué)習(xí)吧,本文重點(diǎn)給大家介紹IOS中各種手勢(shì)操作實(shí)例代碼,一起看看吧
    2017-03-03
  • iOS 設(shè)置View陰影效果

    iOS 設(shè)置View陰影效果

    本文通過(guò)實(shí)例代碼給大家講解了iOS 設(shè)置View陰影效果,代碼簡(jiǎn)單易懂非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-05-05
  • iOS開(kāi)發(fā)系列--詳細(xì)介紹數(shù)據(jù)存取

    iOS開(kāi)發(fā)系列--詳細(xì)介紹數(shù)據(jù)存取

    本篇文章主要介紹了iOS開(kāi)發(fā)系列--詳細(xì)介紹數(shù)據(jù)存取,詳細(xì)介紹了IOS數(shù)據(jù)的存儲(chǔ)問(wèn)題,具有一定的參考價(jià)值,有興趣的同學(xué)可以了解一下。
    2016-11-11
  • iOS浮點(diǎn)類(lèi)型精度問(wèn)題的原因與解決辦法

    iOS浮點(diǎn)類(lèi)型精度問(wèn)題的原因與解決辦法

    在iOS開(kāi)發(fā)中,我們經(jīng)常要使用浮點(diǎn)類(lèi)型去接收后臺(tái)返回過(guò)來(lái)的的數(shù)據(jù),這時(shí)往往會(huì)遇到精度問(wèn)題,這篇文章主要給大家介紹了關(guān)于iOS浮點(diǎn)類(lèi)型精度問(wèn)題的原因與解決辦法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-01-01

最新評(píng)論