摘要:場景在并發編程中存在線程安全問題,主要原因有存在共享數據,多線程共同操作共享數據。底層語義原理可通過工具和去觀察的底層以及線程情況。注同一個線程可以對同一個對象多次加鎖,,,重入鎖
1. 場景
??????在并發編程中存在線程安全問題,主要原因有:存在共享數據,多線程共同操作共享數據。關鍵字synchronized可以保證在同一時刻,只有一個線程可以執行某個方法或某個代碼塊,同時synchronized可以保證一個線程的可見性
2. 概念利用鎖的機制來實現同步的(解決數據點不一致性 JMM)
鎖機制有如下兩種特性
互斥性
在同一時間只允許一個線程持有某個對象鎖,通過這種特性來實現多線程中的協調機制,這樣在同一時間只有一個線程對所需同步的代碼塊(復合操作)進行訪問。互斥性也稱為操作的原子性
可見性
必須確保在鎖被釋放之前,對共享變量所做的修改,對于隨后獲得該鎖的另一個線程是可見的(即在獲得鎖時應獲得最新共享變量的值),否則另一個線程可能是在本地緩存的某個副本上繼續操作從而引起不一致。
同步方法(分普通方法和靜態方法)
用法:只需要在方法上面添加synchronized關鍵字即可。
同步普通方法:只能作用在單例上面,如果不是單例,同步方法鎖將失效。
同步靜態方法:不管你有多少個類實例,同時只有一個線程能獲取鎖進入這個方法。
同步對象實例
private static int m = 0; private Object obj = new Object(); public void test1() { try { synchronized (obj) { TimeUnit.MINUTES.sleep(2); m++; } } catch (InterruptedException e) { e.printStackTrace(); } }
同步類
鎖效果與同步靜態方法一樣,都是類級別的鎖,同時只有一個線程能訪問帶有同步類鎖的方法。
public class synchronizedDemo { private static int m = 0; public void test2() { try { synchronized (synchronizedDemo.class) { TimeUnit.MINUTES.sleep(2); m++; } } catch (InterruptedException e) { e.printStackTrace(); } } }
同步this實例
與同步塊的用法一致,表示鎖住整個當前對象實例,只有獲取到這個實例的鎖才能進入這個方法。
private static int m = 0; public void test2() { try { synchronized (this) { TimeUnit.MINUTES.sleep(2); m++; } } catch (InterruptedException e) { e.printStackTrace(); } }4. synchronized底層語義原理
可通過工具jconsole和jstack去觀察synchronized的底層以及線程情況。
方法鎖:
方法鎖就是由關鍵字ACC_SYNCHRONIZED實現是否互斥方法,
對象鎖:
monitor:在jvm規范中每個對象和類在邏輯上都是和一個監視器(monitor)相關聯的,為了實現監視器的排他性監視能力,JVM為每一個對象和類都關聯一個鎖,鎖住了一個對象,這就是獲得對象相關聯的監視器。
實現原理:某一個線程占有這個對象的時候,首先monitor的計數器是不是0,如果是0表示還沒有線程占有這個時候線程占有這個對象,并且對這個對象的monitor+1;如果不為0表示這個對象已經被其他線程占有,這個線程等待。當線程釋放占有權的時候monitor-1。
注:同一個線程可以對同一個對象多次加鎖,+1,+1,重入鎖
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/75905.html
摘要:基本元素機制需要幾個元素來配合,分別是臨界區對象及鎖條件變量以及定義在對象上的,操作。這個外部條件在機制中稱為條件變量。提供的機制,其實是,等元素合作形成的,甚至說外部的條件變量也是個組成部分。 monitor的概念 管程,英文是 Monitor,也常被翻譯為監視器,monitor 不管是翻譯為管程還是監視器,都是比較晦澀的,通過翻譯后的中文,并無法對 monitor 達到一個直觀的描...
摘要:使用可以禁止的指令重排,保證在多線程環境下也能正常運行。關鍵字底層原理總結關鍵字底層原理屬于層面。另外在中引入了自適應的自旋鎖。自適應的自旋鎖帶來的改進就是自旋的時間不在固定了,而是和前一次同一個鎖上的自旋時間以及鎖的擁有者 【強烈推薦!非廣告!】阿里云雙11褥羊毛活動:https://m.aliyun.com/act/team1111/#/share?params=N.FF7yxCc...
摘要:近段時間在準備實習的面試,在網上看到一份面試題,就慢慢試著做,爭取每天積累一點點?,F在每天給自己在面試題編寫的任務是題,有時候忙起來可能就沒有時間寫了,但是爭取日更,即使當天沒更也會在之后的更新補上。 ????近段時間在準備實習的面試,在網上看到一份面試題,就慢慢試著做,爭取每天積累一點點。????暫時手頭上的面試題只有一份,題量還是挺大的,有208題,所以可能講的不是很詳細,只是我自...
摘要:今天給大家總結一下,面試中出鏡率很高的幾個多線程面試題,希望對大家學習和面試都能有所幫助。指令重排在單線程環境下不會出先問題,但是在多線程環境下會導致一個線程獲得還沒有初始化的實例。使用可以禁止的指令重排,保證在多線程環境下也能正常運行。 下面最近發的一些并發編程的文章匯總,通過閱讀這些文章大家再看大廠面試中的并發編程問題就沒有那么頭疼了。今天給大家總結一下,面試中出鏡率很高的幾個多線...
閱讀 1111·2021-09-22 16:04
閱讀 1494·2019-08-30 15:43
閱讀 1097·2019-08-29 14:01
閱讀 3438·2019-08-26 12:19
閱讀 3353·2019-08-26 12:15
閱讀 1444·2019-08-26 12:13
閱讀 3264·2019-08-23 17:00
閱讀 1484·2019-08-23 15:38