最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

談談iOS中的幾種鎖

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

1 前言

近日工作不是太忙,剛好有時間了解一些其他東西,本來打算今天上午去體檢,但是看看天氣還是明天再去吧,也有很大一個原因:就是周六沒有預約上!閑話少說,這里簡單對鎖來個簡單介紹分享。

2 目錄

  1. 第一部分:什么是鎖
  2. 第二部分:鎖的分類
  3. 第三部分:鎖的作用
  4. 第四部分:iOS中鎖的實現

第一部分:什么是鎖

從小就知道鎖,就是家里門上的那個鎖,用來防止盜竊的鎖。它還有鑰匙,用于開鎖。不過這里的鎖,并不是小時候認知的鎖,而是站在程序員的角度的鎖。這里我就按照我的理解來介紹一下鎖。

在計算機科學中,鎖是一種同步機制,用于在存在多線程的環(huán)境中實施對資源的訪問限制。你可以理解成它用于排除并發(fā)的一種策略??蠢?br />

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

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

class Acccount {
long val = 0; //這里不可在其他方法修改,只能通過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;
  }
}
}

這樣就能防止多個任務去修改val了,(這里注意,如果val是public的,那個也會導致一些問題)。

第二部分:鎖的分類

鎖根據不同的性質可以分成不同的類。

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

分類方式 分類
按鎖的粒度劃分 表級鎖、行級鎖、頁級鎖
按鎖的級別劃分 共享鎖、排他鎖
按加鎖方式劃分 自動鎖、顯示鎖
按鎖的使用方式劃分 樂觀鎖、悲觀鎖
按操作劃分 DML鎖、DDL鎖

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

第三部分:鎖的作用

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

第四部分:iOS中鎖的實現

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

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

這幾個子類都遵循了NSLock的協議,這里簡單介紹一下其中的幾個方法:

對于tryLock方法,嘗試獲取一個鎖,并且立刻返回Bool值,YES表示獲取了鎖,NO表示沒有獲取鎖失敗。 lockBeforeDate:方法,在某個時刻之前獲取鎖,如果獲取成功,則返回YES,NO表示獲取鎖失敗。接下來就讓我們看一下iOS中實現鎖的方式:

方式1 使用NSLock類

- (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];
    }
  });
}

對于synchorize指令中使用的testLock為該鎖標示,只有標示相同的時候才滿足鎖的效果。它的優(yōu)點是不用顯式地創(chuà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 性能對比

這里簡單寫一個小程序來進行四種方式的性能對比,這里再固定次數內進行了加鎖解鎖,然后輸出用時,結果如下(測試1、2執(zhí)行次數不一樣:測試1 < 測試2):

測試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

測試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

這里還測試了OSSPinLock(此類已經被os_unfair_lock所替代)。結果如下:

synthorize > NSLock > pthread > gcd > os_unfair_lock >OSSPinLock

這里:

synthorize內部會添加異常處理,所以耗時。

pthread_mutex底層API,處理能力不錯。

gcd系統封裝的C代碼效果比pthread好。

4 總結

簡單就介紹這么多。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • 如何在自己的電腦上配置APNS推送環(huán)境

    如何在自己的電腦上配置APNS推送環(huán)境

    這篇文章主要介紹了如何在自己的電腦上配置APNS推送環(huán)境的相關資料,需要的朋友可以參考下
    2015-11-11
  • iOS中利用inputView 彈出 picker

    iOS中利用inputView 彈出 picker

    這篇文章主要介紹了iOS中利用inputView 彈出 picker的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-12-12
  • Xcode提高開發(fā)效率的代碼塊分享

    Xcode提高開發(fā)效率的代碼塊分享

    這篇文章跟大家介紹的是一些提高大家開發(fā)效率Xcode的代碼塊,以及如何備份代碼塊,Xcode的代碼片段(Code Snippets)創(chuàng)建自定義的代碼片段,當你重用這些代碼片段時,會給你帶來很大的方便。有需要的朋友們可以參考借鑒。
    2016-09-09
  • iOS中如何判斷當前網絡環(huán)境是2G/3G/4G/5G/WiFi

    iOS中如何判斷當前網絡環(huán)境是2G/3G/4G/5G/WiFi

    這篇文章主要給大家介紹了關于iOS中如何判斷當前網絡環(huán)境是2G/3G/4G/5G/WiFi的相關資料,文中通過示例代碼介紹的非常詳細,對各位iOS開發(fā)者們具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-07-07
  • iOS音樂后臺播放及鎖屏信息顯示

    iOS音樂后臺播放及鎖屏信息顯示

    這篇文章主要為大家詳細介紹了iOS音樂后臺播放及鎖屏信息顯示,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • iOS開發(fā)之級聯界面(推薦界面)搭建原理

    iOS開發(fā)之級聯界面(推薦界面)搭建原理

    這篇文章主要為大家詳細介紹了iOS級聯界面(推薦界面)搭建原理,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-08-08
  • 手把手教你實現微信小視頻iOS代碼實現

    手把手教你實現微信小視頻iOS代碼實現

    這篇文章主要手把手教你實現微信小視頻,iOS代碼實現微信小視頻功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-08-08
  • IOS中html5上傳圖片方向問題解決方法

    IOS中html5上傳圖片方向問題解決方法

    這篇文章主要介紹了IOS中html5上傳圖片方向問題解決方法的相關資料,需要的朋友可以參考下
    2016-01-01
  • iOS實現垂直滑動條效果

    iOS實現垂直滑動條效果

    這篇文章主要為大家詳細介紹了iOS實現垂直滑動條效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • safari調試iOS app web頁面的步驟

    safari調試iOS app web頁面的步驟

    這篇文章主要為大家詳細介紹了safari調試iOS app web頁面的步驟,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06

最新評論

灯塔市| 莱阳市| 黑龙江省| 巩留县| 信丰县| 双流县| 当阳市| 吴忠市| 弥勒县| 安塞县| 长寿区| 宁阳县| 马山县| 南川市| 泰宁县| 舟曲县| 崇信县| 留坝县| 抚州市| 措美县| 绥芬河市| 崇文区| 四川省| 长子县| 万宁市| 资溪县| 田林县| 舟山市| 株洲市| 西乌珠穆沁旗| 张家港市| 平顶山市| 新郑市| 大兴区| 孟连| 乌拉特中旗| 桂平市| 徐汇区| 鸡泽县| 正定县| 论坛|