同步鎖前傳 相關術語索引

前言

接下來,我想把同步鎖相關的內容梳理梳理。其實不單單是同步鎖,所有的JUC的內容我都想理清楚。因爲,時而感覺自己對這塊挺了解,時而又感覺模糊。因此我打算自己梳理一下,同時整理成筆記,一方面是方便自己,另一方面是方便別人。

鎖的相關術語比較多,有些還比較晦澀。很多的時候,我自己都不能準確表達,平時在講的時候也沒有太注意這些。因此接下來內容中出現有些用語不當,表述有偏差的地方,還希望您能慷慨指出。

術語索

原子性

在看原子性之前,我們先看看什麼是原子
1. 原子,記得在化學中提到原子是這麼定義的

原子是元素能保持其化學性質的最小單位。 來自 wikipedia

因此我們認爲原子是世界上最小的物質單位,具體有不可分割性
2. 原子操作
由此可見原子操作,是一個不再分的操作。
如,a=0 是一個子原操作。但a++, 不是原子操作,因爲它是可以分解成 int t = a + 1; a = t; 兩個操作。
3. 原子性
由此便可引出原子性了,即是
一個操作屬於原子操作的話,那麼我們稱它具有原子性

原語

通常把不可斷的過程稱之爲原語。

是由若干條指令組成的,用於完成一定功能的一個過程。
primitive or atomic action 是由若干個機器指令構成的完成某種特定功能的一段程序,具有不可分割性。即原語的執行必須是連續的,在執行過程中不允許被中斷。——百度百科

可見性

可見性,是指線程之間的可見性,一個線程修改的狀態對另一個線程是可見的。
其實我一直覺得,講清楚這個東西挺難的,但是理解它又挺容易。先做簡單解釋,當然這個並不嚴謹,但可以有個簡單的印象,後續在介紹volatile時,我們再具體來聊這個事。

內存是線程共享,線程A操作變量後,直接更新內存之後,線程B立馬可以看到線程A操作的效果。–這就是可見性。

臨界區

我們把併發進程中與共享變量有關的程序段稱爲臨界區。 —— 來自操作系統

可重入

可重入,顧名思義,即是可以遞歸、循環進入。現在這個解釋放在可重入鎖的可重入時,感覺怪怪的。本人語言比較差,感覺自己實在沒法用文字說清,直接上代碼用例子來看看吧。

public synchronized void barfoo() {
    ...
    bar();
    ...
    foo();
    ...
}

public synchronized void bar() {
}

public synchronized void foo() {
}

P.S. synchronized具有可重入性。

如果synchronized不具有可重入性的話,我們barfoo()就會出現死鎖,因爲barfoo在調用bar時是沒辦法拿取到鎖的。這就是可重入性

再看一段代碼

private Connection connection = null;
public synchronized Connection reconnect(final int timesOfRetry) {
    if(connection == null) try {
        connection = create();
    } catch (Exception e) {
        reconnect(timesOfRetry + 1);
    }
    return connection;
}

也就是說能夠讓當前線程(鎖的持有者)多次的獲取鎖操作。

公平性

這個維基沒有,我自己來吧。公平性是對鎖存在情況競爭的情況下,誰先由誰先拿到鎖的策略而言的。假若,在競爭鎖的時候大家都來一起排隊,先到先得,我們認爲這種策略是公平的。假若,不是嚴格依照這個次序獲取鎖的情況,我們就稱它是不公平。即是新來的人反倒有更大的機會拿到鎖,這就是不公平的。
在實現上,新來的人,先做一次檢查,如果有當時有鎖資源,就先會給新人。否則進入隊列跟大家一塊排隊*

排他鎖

排他鎖,也叫獨佔鎖,顧名思義即是只能有一個線程同時獲取這個鎖。也叫X鎖。

共享鎖

共享鎖,也叫讀鎖,允許多個線程持有這個鎖。稱S鎖。

自旋鎖

自旋旋,是一個不可重入性鎖。

自旋鎖是採用讓當前線程不停地的在循環體內執行實現的,當循環的條件被其他線程改變時才能進入臨界區。——來自ifeve

可重入鎖

可重入鎖,也叫做遞歸鎖,指的是同一線程 外層函數獲得鎖之後 ,內層遞歸函數仍然有獲取該鎖的代碼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章