1. 程式人生 > >多執行緒基礎學習十二:概念瞭解-重入鎖、獨佔鎖與共享鎖、公平鎖與非公平鎖

多執行緒基礎學習十二:概念瞭解-重入鎖、獨佔鎖與共享鎖、公平鎖與非公平鎖

前面瞭解了J.U.C中兩個重要的類或介面,其它的實現類都是以此為基礎的,現在還需要了解一下一些鎖的概念,有助於後面學習一些實現類或介面。

重入鎖

在併發中,無論是synchronized還是lock也好,內部都有重入的特性,而且特性的含義是一樣的。

重入(re-entrant),同一個執行緒可以獲取已持有的鎖;

已知的有兩種出現場景:
1、加鎖方法呼叫另外一個加鎖方法;
2、遞迴呼叫加鎖方法;

歸根結底,就是一個加鎖方法呼叫了另外一個加鎖方法;

如果沒有重入的特性:

public class ReentrantTest {


    public static void main (String[] args) {

        new
Thread(new TestRunnable()).start(); } static class TestRunnable implements Runnable { @Override public void run () { Test.say(); } } static class Test { public static synchronized void say() { dosomething(); } public
static synchronized void dosomething() { } } }

如果synchronized 沒有重入特性,執行say方法時執行緒獲取到Test的鎖,呼叫dosomething的時候,再次獲取鎖,因為沒有重入鎖特性,導致無法獲取到鎖,執行緒就會死鎖,這樣就會出錯。

所以重入鎖是為了解決重複獲取鎖的問題的,執行緒物件是當前持鎖物件。

獨佔鎖與共享鎖

獨佔鎖與共享鎖,執行緒物件是多個執行緒;
獨佔鎖,從名字上就可以知道,一個執行緒獲取了鎖,其它執行緒就不能獲取到鎖,必須等鎖釋放了,才能可能獲取到鎖。

舉個例子:

沙漠中有一杯水,有十個旅行者,都想喝水,但是同時只能一個人拿起水杯喝水,一個人喝完,第二個人才能喝水。

共享鎖,是可以多個執行緒獲取到鎖,但是任何東西都不是無限制的,不是任何執行緒都可以共享鎖。

舉個例子:

圖書館裡有一本書,各個樓層的書館室內的電腦,都可以查到這個本書的資訊,不是隻能一臺電腦查完,其它書館室的電腦才能查詢這本數的資訊;但是也不是任何電腦都能查詢這本數的資訊,學生自己帶到圖書館的電腦就不能查詢書的資訊。

後面有一個ReentrantReadWriteLock就是這種鎖機制,後面詳細學習的時候,再好好了解這個介面。

公平鎖與非公平鎖

公平鎖與非公平鎖,物件也是多個執行緒。

什麼是公平?
簡而言之,付出多的,應該得到回報,在日常購物排隊中,因為排在前面的比排在後面的等的時間長(相鄰兩個人,前面一個相對與後面一個), 最先結賬的應該是排在最前面的。

公平鎖,按照上面的邏輯來安排獲取鎖的話,應該先啟動的先獲取鎖,後啟動的後獲取鎖。

非公平鎖,就是不排隊,都去結賬,誰搶到了位置(獲取到鎖),誰就去結賬(執行程式碼);

這些邏輯體現在程式碼上,就是當執行緒釋放了鎖,需要從等待執行緒佇列中取出執行緒用來獲取鎖的邏輯,是取等待執行緒中最先啟動的,還是都取出來,自由競爭。

總結

瞭解上面的概念之後,對學習相關的類有很大幫助,對面試也有很大幫助。

相關推薦

執行基礎學習概念瞭解-獨佔共享公平公平

前面瞭解了J.U.C中兩個重要的類或介面,其它的實現類都是以此為基礎的,現在還需要了解一下一些鎖的概念,有助於後面學習一些實現類或介面。 重入鎖 在併發中,無論是synchronized還是lock也好,內部都有重入的特性,而且特性的含義是一樣的。 重入(

執行的弊端,執行基礎學習

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using

Java執行高併發知識點執行池和CountDownLatch

執行緒池 池化是在為了複用常用的一種技術解決思路,比如連線池、執行緒池等,執行緒池主要是為了降低執行緒建立和銷燬造成的資源消耗,進而起到解決系統資源,提高系統相應速度的目的。Java中的ThreadPoolExecutor是JDK為我們提供好的執行緒池工具。

Linux執行基礎學習(八)私有資料

/*============================================================================ // Name : thread_privateData.cpp // Author : Ryan // Version

ios執行操作()—— 自定義NSOperation實現網路下載後回撥

- (void)main { @autoreleasepool { // 下載圖片的耗時操作 NSURL *url = [NSURL URLWithString:self.urlString]; NSData *data = [NSDa

執行程式設計學習一(ThreadPoolExecutor 詳解).

一、ThreadPoolExecutor 引數說明 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize,

Java 執行基礎)interrupt()和執行終止方式

Java 多執行緒基礎(十)interrupt()和執行緒終止方式 一、interrupt() 介紹 interrupt() 定義在 Thread 類中,作用是中斷本執行緒。 本執行緒中斷自己是被允許的;其它執行緒呼叫本執行緒的 interrupt() 方法時,會通過 checkAccess() 檢查許可權。

Java 執行基礎一)執行優先順序和守護執行

 Java 多執行緒基礎(十一)執行緒優先順序和守護執行緒 一、執行緒優先順序 Java 提供了一個執行緒排程器來監控程式啟動後進去就緒狀態的所有執行緒。執行緒排程器通過執行緒的優先順序來決定排程哪些執行緒執行。一般來說,Java的執行緒排程器採用時間片輪轉演算法使多個執行緒輪轉獲得CPU的時間片。

Java 執行基礎(一)基本概念

Java 多執行緒基礎(一)基本概念 一、併發與並行 1、併發:指兩個或多個事件在同一個時間段內發生。 2、並行:指兩個或多個事件在同一時刻發生(同時發生)。 在作業系統中,安裝了多個程式,併發指的是在一段時間內巨集觀上有多個程式同時執行,這在單 CPU 系統中,每一時刻只能有一道程式執行,即微觀上這些程

201711671103《JAVA程式設計》第執行機制學習筆記

教材學習內容總結 1.執行緒是依附於程序的,程序是分配資源的最小單位,執行緒是比程序更小的執行單位。一個程序可以產生多個執行緒,形成多條執行線索。每條線索,即每個執行緒也有它自身的產生,存在和消亡過程,也是一個動態的概念。 2.JAVA 中的多執行緒機制:多執行緒是指一個應用程式同時存在好幾

執行基礎執行的啟動終止,執行面臨的三種問題)

一、執行緒的啟動、終止方式   啟動: start native(呼叫外部介面啟動)     終止:    stop(類似kill,暴力終止)  interrupt 中斷的方式 通過指令的方式 volatile boolean stop

java學習筆記-執行程式設計模擬個人過山洞

編寫多執行緒應用程式,模擬多個人通過一個山洞的模擬。這個山洞每次只能通過一個人,每個人通過山洞的時間為5秒,隨機生成10個人,同時準備過此山洞,顯示一下每次通過山洞人的姓名。   使用執行緒同步,把山洞看做臨界資源,五秒內只允許一個人來訪問。 class cave { p

java執行快速入門(一)

CountDownLatch(閉鎖)計數器   有一個任務A,它要等待其他4個任務執行完畢之後才執行,此時就可以利用CountDownLatch來實現這種功能 package com.cppdy; import java.util.concurrent.CountDownLatch

Java執行基礎

Java中的多執行緒 程序:一個程式的執行 執行緒:程式中某個順序的流程控制,通俗來講,就是不同的任務 一個程序可以有多個執行緒 執行緒的分類 普通執行緒(非Daemon執行緒) 在Java中,如果還有非Daemon執行緒,整個程式就不會結束 Daemon

java執行快速入門(

執行緒池的好處:   避免我們過多的去new執行緒,new是佔資源的(GC主要堆記憶體)   提高效率   避免浪費資源   提高響應速度 作用:會把之前執行某個執行緒完畢的執行緒不會釋放掉會留到執行緒池中給下一個呼叫的執行緒直接使用 前提:AB執行緒在同一個執行緒池裡面;A執行緒執行完畢了,B執

執行學習-day-01執行基礎

執行緒基礎、執行緒之間的共享和協作 (目前會將一些概念簡單描述,一些重點的點會詳細描述) 1,CPU核心數和執行緒數之間的關係 ①、一塊CPU只有一塊處理器 ②、Inter提出了多核處理器 ③、CPU核心數 和 執行緒數 是 1:1 的關係 ④、Inter提出了超執行緒,

(一)執行說學逗唱關於執行那不得不說的三事

(二)多執行緒說學逗唱:新手村偶遇Thread類 為什麼一上來就要寫這個 這個是啥,那個那個是啥,直接進去主題不好嗎?以前我也是這麼想的,可是後來呀…總之,一個不刨根問底的程式設計師不是好程式設計師,要深究一個知識點還就得知道他是從哪裡來,到哪裡去,既然來到這個事件

PX4概念學習(1)——Linux下程序執行基礎

【學習Freeape大神的uORB時,乘機補補有關Linux多程序、多執行緒的知識】 uORB(Micro Object Request Broker,微物件請求代理器)是PX4/Pixhawk系統中非常重要且關鍵的一個模組,它肩負了整個系統的資料傳輸任務,所有的感測器資料

Java執行執行基礎

多執行緒基礎 多執行緒實現-Thread和Runnable 通常使用如下程式碼啟動一個新的執行緒: private void startNewThread1() { new Thread() { @Override pub

併發程式設計之執行基礎-Thread和Runnable的區別及聯絡()

上篇文章講述了建立執行緒的常用方式 本篇主要分析一下Thread和Runnable兩種方式建立執行緒的區別及聯絡 聯絡: ▶Thread類實現了Runable介面。 ▶都需要重寫裡面Run方法。 區別: ▶Thread方式不支援多繼承,Runnable方式支援多個實現 ▶Runnable更容易實