UNIX(多線程):26---悲觀鎖和樂觀鎖

鎖(Lock):
在介紹悲觀鎖和樂觀鎖之前,讓我們看一下鎖。鎖,在我們生活中隨處可見,我們的門上有鎖,我們存錢的保險柜上有鎖,是用來保護我們財產安全的。程序中也有鎖,當多個線程修改共享變量時,我們可以給修改操作上鎖(syncronized)。當多個用戶修改表中同一數據時,我們可以給該行數據上鎖(行鎖)。因此,鎖其實是在并發下控制多個操作的順序執行,以此來保證數據安全的變動。 并且,鎖是一種保證數據安全的機制和手段,而并不是特定于某項技術的。悲觀鎖和樂觀鎖亦是如此。 

悲觀鎖(Pessimistic Lock)

顧名思義,就是很悲觀,每次去拿數據的時候都認為別人會修改,所以每次在拿數據的時候都會上鎖,這樣別人想拿這個數據就會block直到它拿到鎖。傳統的關系型數據庫里邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。它指的是對數據被外界(包括本系統當前的其他事務,以及來自外部系統的事務處理)修改持保守態度,因此,在整個數據處理過程中,將數據處于鎖定狀態。悲觀鎖的實現,往往依靠數據庫提供的鎖機制(也只有數據庫層提供的鎖機制才能真正保證數據訪問的排他性,否則,即使在本系統中實現了加鎖機制,也無法保證外部系統不會修改數據)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/444278.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/444278.shtml
英文地址,請注明出處:http://en.pswp.cn/news/444278.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

leetcode511. 游戲玩法分析 I(SQL)

活動表 Activity: ----------------------- | Column Name | Type | ----------------------- | player_id | int | | device_id | int | | event_date | date | | games_played | int | ----------------------- 表的主鍵是 (player_i…

UNIX(多線程):27---多線程并發之原子操作與無鎖編程

原子操作:顧名思義就是不可分割的操作,該操作只存在未開始和已完成兩種狀態,不存在中間狀態; 原子類型:原子庫中定義的數據類型,對這些類型的所有操作都是原子的,包括通過原子類模板std::atomic< T >實例化的數據類型,也都是支持原子操作的。 二、如何使用原子類…

leetcode512. 游戲玩法分析 II(SQL)

Table: Activity ----------------------- | Column Name | Type | ----------------------- | player_id | int | | device_id | int | | event_date | date | | games_played | int | ----------------------- (player_id, event_date) 是這個表…

UNIX(多線程):28---雙buffer “無鎖” 設計

在linux多線程環境下對同一變量進行讀寫時,經常會遇到讀寫的原子性問題,即會出現競爭條件。為了解決多個線程對同一變量訪問時的競爭條件問題,操作系統層面提供了鎖、信號量、條件變量等幾種線程同步機制。如果對變量的每次訪問都使用上述機制,由于系統調用會陷入內核空間,…

UNIX(進程間通信):01---Linux進程通信方式

Linux下的進程通信手段基本上是從Unix平臺上的進程通信手段繼承而來的。而對Unix發展做出重大貢獻的兩大主力AT&T的貝爾實驗室及BSD(加州大學伯克利分校的伯克利軟件發布中心)在進程間通信方面的側重點有所不同。前者對Unix早期的進程間通信手段進行了系統的改進和擴充,…

UNIX(進程間通信):02---父子進程之間的數據共享分析

之前我們通過fork()函數,得知了父子進程之間的存在著代碼的拷貝,且父子進程都相互獨立執行,那么父子進程是否共享同一段數據,即是否存在著數據共享。接下來我們就來分析分析父子進程是否存在著數據共享。 我們都知道,在linux下,內存存儲的位置是全局變量,棧區,堆區,以…

UNIX(進程間通信):03---僵尸進程

僵尸進程 僵尸進程是指一個已經終止、但是其父進程尚未對其進行善后處理獲取終止進程的有關信息的進程,這個進程被稱為“僵尸進程”(zombie)。 怎樣產生僵尸進程 一個進程在調用exit命令結束自己的生命的時候,其實它并沒有真正的被銷毀,而是留下一個稱為僵尸進程(Zomb…

Oracle中關于計算時間差的例子:

今天在做項目的時候遇到了這樣一個問題&#xff1a;就是要得到在線時長&#xff1a; 截圖如下&#xff1a;最后要達到如下效果&#xff1a; 我之前想了一種方案&#xff1a;我想通過SQL語句查庫&#xff0c;但是最后發現這種辦法還解決不了&#xff0c;最后我又想了一種&#…

UNIX(進程間通信):04---孤兒進程

上一篇文章講過僵尸進程,這里再分享給大家另外一種狀態。 孤兒進程 什么是孤兒進程?當一個子進程還在執行時,它的父進程已經退出了,那么這個子進程的退出信息也沒有被父進程接收到,如果子進程的退出信息沒有被別的進程接收到,那么這個子進程就會變成一個僵尸進程,所…

UNIX(進程間通信):05---守護進程

守護進程是在后臺運行不受終端控制的進程(如輸入、輸出等),一般的網絡服務都是以守護進程的方式運行。守護進程脫離終端的主要原因有兩點:(1)用來啟動守護進程的終端在啟動守護進程之后,需要執行其他任務。(2)(如其他用戶登錄該終端后,以前的守護進程的錯誤信息不應…

leetcode570. 至少有5名直接下屬的經理(SQL)

Employee 表包含所有員工和他們的經理。每個員工都有一個 Id&#xff0c;并且還有一列是經理的 Id。 ------------------------------------- |Id |Name |Department |ManagerId | ------------------------------------- |101 |John |A |null …

UNIX(進程間通信):16深入理解Socket

socket又叫套接字或者插口,它也是進程間通信的一種方式,實際上就是網絡上的通信節點,應用程序只需要鏈接到socket就可以和網絡上任何一個通信端點連接、傳送數據。socket封裝了通信的細節,我們可以不必關心通信協議內容而專注于應用程序開發。根據數據傳送方式,socket分為…

蘋果支付:如何解決沙盒環境下獲取可恢復購買項為空

在傳統手游開發中免不了和蘋果支付打交道,而且蘋果也會有各種奇奇怪怪的問題和BUG 。 曾經有一次某一個游戲出現了調單問題,現象如下(我有點懶,不想畫泳道圖或者時序圖): 客戶端拉起支付付款成功,OC底層收到支付成功回調->發送支付成功的收據到服務器驗…

leetcode25. K 個一組翻轉鏈表

給你一個鏈表&#xff0c;每 k 個節點一組進行翻轉&#xff0c;請你返回翻轉后的鏈表。 k 是一個正整數&#xff0c;它的值小于或等于鏈表的長度。 如果節點總數不是 k 的整數倍&#xff0c;那么請將最后剩余的節點保持原有順序。 示例 : 給定這個鏈表&#xff1a;1->2-…

游戲服務器架構:如何設計開發戰斗系統的技能和buff系統

戰斗系統中buff和skill如何配合 在網絡游戲中的戰斗形式多種多樣,不同游戲的戰斗邏輯也有很大的差異。但是一般都會涉及技能系統和buff系統,兩種之間相互關聯,技能可以產生buff作用在目標上,影響目標。同時buff也會影響技能的釋放效果,兩者都可以算得上游戲戰斗系統最重要…

一文徹底搞懂靜態庫和動態庫,顯示鏈接和隱式鏈接

定義&#xff1a;運行時庫 靜態庫 動態庫運行時庫&#xff1a;Unix中一個典型的運行時庫例子就是libc&#xff0c;它包含標準的C函數&#xff0c;如&#xff0c;print()&#xff0c;exit()等等&#xff0c;用戶能創建他們自己的運行庫&#xff08;在Windows中是DLL&#xff09;…

mysql的cpu高定位

導致數據庫CPU很高的原因有很多種,一般和慢SQL也有關(因為每條SQL要么占CPU高,要么占IO高,大體是這樣)。 (1)、如果服務器有多個mysql實例,需要通過top命令看看是哪個mysql實例導致的cpu高(如果不是mysql導致的cpu高,需要優化其他導致cpu的程序): (2)、定位到占用…

kubelet內存異常分析

背景: kubelet被重啟后, 內存再次升高, 在游戲啟動后,沒有進入大量玩家的情況下,2天時間占用接近10G,并且持續在增長, CPU偶爾負載高。AWS給出的解釋是containerd v1.4.0版本問題, 以下為內部分析過程。 實際情況 # 整體情況 [ec2-user@server]$ free -h …

游戲服務器架構-設計模式之發布訂閱模式

發布訂閱模式場景 熟悉消息中間件的同學應該對發布/訂閱模式(Publish Subscribe Pattern)并不陌生。即使你不了解消息中間件,那么在平時生活中發布/訂閱模式也是非常常見的場景。 比如你打開你的微信訂閱號,你訂閱的作者發布的文章,會廣播給每個訂閱者。在這個場景里,微信公…

leetcode129. 求根到葉子節點數字之和

給定一個二叉樹&#xff0c;它的每個結點都存放一個 0-9 的數字&#xff0c;每條從根到葉子節點的路徑都代表一個數字。 例如&#xff0c;從根到葉子節點路徑 1->2->3 代表數字 123。 計算從根到葉子節點生成的所有數字之和。 說明: 葉子節點是指沒有子節點的節點。 …