1. 程式人生 > >多執行緒——原子、非原子,自旋鎖和互斥鎖

多執行緒——原子、非原子,自旋鎖和互斥鎖

  • nonatomic:非原子屬性,執行緒不安全的,效率高
  • atomic:原子屬性,執行緒安全的,效率相對低。
  • 原子屬性是一種單(執行緒)寫多(執行緒)讀的多執行緒技術,不過可能會出現髒資料

    • atomic屬性內部的鎖稱為 自旋鎖
    • 凡是執行緒安全的物件,內部肯定會加鎖。
  • 自旋鎖和互斥鎖
    • 相同點:都能保證同一時間只有一個執行緒訪問共享資源。都能保證執行緒安全。
    • 不同點:
      • 互斥鎖:如果共享資料已經有其他執行緒加鎖了,執行緒會進入休眠狀態等待鎖。一旦被訪問的資源被解鎖,則等待資源的執行緒會被喚醒。
      • 自旋鎖:如果共享資料已經有其他執行緒加鎖了,執行緒會以死迴圈的方式等待鎖,一旦被訪問的資源被解鎖,則等待資源的執行緒會立即執行。
    • 自旋鎖的效率高於互斥鎖。

IOS開發建議

  • 所有屬性都宣告為nonatomic
  • 儘量避免多執行緒搶奪同一塊資源
  • 儘量將加鎖、資源搶奪的業務邏輯交給伺服器端處理,減少移動客戶端的壓力

相關推薦

執行——原子原子互斥

nonatomic:非原子屬性,執行緒不安全的,效率高 atomic:原子屬性,執行緒安全的,效率相對低。 原子屬性是一種單(執行緒)寫多(執行緒)讀的多執行緒技術,不過可能會出現髒資料 atomi

python執行————3執行間通訊:共享變數queue

1、共享變數 #通過共享變數 import time import threading url_list = [] def get_detail_html(): global url_list while True: if len(url_list):

如何實現執行?實現執行為什麼要調start而不是run方法?(繼承Thread類實現Ruable介面Callable<V>)

什麼是程序? 作業系統中一個程式的執行週期(從開啟到關閉)。程序是具有一個或多個執行緒的執行緒組。 什麼是執行緒? 一個程序可以同時執行多個任務,任務就是執行緒,一個程序至少有一個執行緒。 執行緒執行在程序內部,執行緒是輕量級程序。 程序和執行緒比較:

[Xcode10 實際操作]八網路與執行-(7)使用MessageUI框架建立併發送一封帶有附件的郵件

本文將演示如何使用MessageUI框架,建立併發送一封帶有附件的郵件。 使用郵件編輯檢視控制器(MFMailComposeViewController)實現郵件功能。 在專案導航區,開啟檢視控制器的程式碼檔案【ViewController.swift】 1 import UIKit 2

秒殺執行第三篇 原子操作 Interlocked系列函式

上一篇《多執行緒第一次親密接觸 CreateThread與_beginthreadex本質區別》中講到一個多執行緒報數功能。為了描述方便和程式碼簡潔起見,我們可以只輸出最後的報數結果來觀察程式是否執行出錯。這也非常類似於統計一個網站每天有多少使用者登入,每個使用者登入用一個執

java執行FutureFutureTask使用示例返回非同步的結果

1、Future、FutureTask介紹 Future是一個介面,該介面用來返回非同步的結果。 FutureTask是一個類,是Future 的一個實現。 2、主要方法 future.get(); 或者 future.get(10000, Ti

C++執行-第一篇-Atomic-原子操作

此係列基於Boost庫多執行緒,但是大部分都在C++11中已經實現,所以兩者基本一致。沒什麼特殊要求,練手還是C++11吧,方便不用配置。 PS:Boost不愧為C++準標準庫。 本來不打算寫,畢竟都是書上的內容,但是後來發現查書太麻煩,所以動手寫了這個系列,幫助我只看程式

如何實現執行?實現執行為什麼要調start而不是run方法?(繼承Thread類實現Ruable介面Callable)

什麼是程序? 作業系統中一個程式的執行週期(從開啟到關閉)。程序是具有一個或多個執行緒的執行緒組。 什麼是執行緒? 一個程序可以同時執行多個任務,任務就是執行緒,一個程序至少有一個執行緒。 執行緒執行在程序內部,執行緒是輕量級程序。 程序和執行緒比較: 與

利用執行(用到原子類AtomicInteger)往資料庫批量插入大量資料

package duocharu; import com.minisay.base.util.OJDBCUtils; import java.sql.Connection; import java.sql.PreparedStatement; import

python執行非同步post請求指令碼可以設定持續執行時間執行時間間隔

#coding=utf8 ''' random.randint(a, b):用於生成一個指定範圍內的整數。 其中引數a是下限,引數b是上限,生成的隨機數n: a <= n <= b random.choice(sequence):從序列中獲取一個隨機元素 引數

執行程式設計學習八(原子操作類).

簡介 Java 在 JDK 1.5 中提供了 java.util.concurrent.atomic 包,這個包中的原子操作類提供了一種用法簡單、效能高效、執行緒安全地更新一個變數的方式。主要提供了四種類型的原子更新方式,分別是原子更新基本型別、原子更新陣列、原子更新引用和原子更新屬性。 Atomic 類基本

C#執行系列(3):原子操作

本章主要講述多執行緒競爭下的原子操作。 目錄知識點競爭條件執行緒同步CPU時間片和上下文切換阻塞核心模式和使用者模式Interlocked 類1,出現問題2,Interlocked.Increment()3,Interlocked.Exchange()4,Interlocked.CompareExchange

python執行————8執行程序對比

#多程序程式設計 #耗cpu的操作,用多程序程式設計,對於io操作來說,使用多執行緒程式設計,程序切換代價要高於執行緒 import time from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor,as_compl

python執行————7ThreadPoolExecutor執行

所用到的模組:from concurrent.futures import ThreadPoolExecutor,as_completed,wait,FIRST_COMPLETED 1、建立執行緒池:executor = ThreadPoolExecutor(max_workers= ) 2

python執行————6執行同步之Semaphore

控制程式碼進入執行緒的數量,控制併發數量,可以使用訊號量Semaphore。 1、定義訊號量sem  =  threading.Semaphore(3)  #3為併發數量 2、消耗訊號量 sem.acquire() 3、釋放訊號量 sem.release()

pyhon執行——5執行同步之condition

如何使用多執行緒實現一問一答呢?可以使用condition中的notify和wait方法實現,看程式碼 import threading import time class XiaoAi(threading.Thread): def __init__(self,cond):

python執行————4執行同步之Lock,RLock

     在多執行緒同時請求同一個資源並進行修改時可能會造成結果出錯,例如共享變數       from dis import dis import threading a = 0 def add(): global a

python執行———2建立執行的兩種方式

 法一、使用Thread類例項化 法二、繼承Thread來實現多執行緒 #對於io操作來說,多執行緒和多程序效能差別不大 #1、使用Thread類例項化 import time import threading def get_detail_html(url): prin

python執行——1GIL

一、GIL是什麼?        執行緒全域性鎖(Global Interpreter lock),python保護執行緒安全而採取的獨立執行緒執行的限制。      1、明確一點GIL並不是python的特性,pytho

實現java執行的3種方式99%人沒用過第3種

實現多執行緒的3種方式 1、繼承Thread類 看jdk原始碼可以發現,Thread類其實是實現了Runnable介面的一個例項,繼承Thread類後需要重寫run方法並通過start方法啟動執行緒。 繼承Thread類耦合性太強了,因為java只能單繼承,所以不利