摘要:場(chǎng)景在并發(fā)編程中存在線程安全問(wèn)題,主要原因有存在共享數(shù)據(jù),多線程共同操作共享數(shù)據(jù)。底層語(yǔ)義原理可通過(guò)工具和去觀察的底層以及線程情況。注同一個(gè)線程可以對(duì)同一個(gè)對(duì)象多次加鎖,,,重入鎖
1. 場(chǎng)景
??????在并發(fā)編程中存在線程安全問(wèn)題,主要原因有:存在共享數(shù)據(jù),多線程共同操作共享數(shù)據(jù)。關(guān)鍵字synchronized可以保證在同一時(shí)刻,只有一個(gè)線程可以執(zhí)行某個(gè)方法或某個(gè)代碼塊,同時(shí)synchronized可以保證一個(gè)線程的可見(jiàn)性
2. 概念利用鎖的機(jī)制來(lái)實(shí)現(xiàn)同步的(解決數(shù)據(jù)點(diǎn)不一致性 JMM)
鎖機(jī)制有如下兩種特性
互斥性
在同一時(shí)間只允許一個(gè)線程持有某個(gè)對(duì)象鎖,通過(guò)這種特性來(lái)實(shí)現(xiàn)多線程中的協(xié)調(diào)機(jī)制,這樣在同一時(shí)間只有一個(gè)線程對(duì)所需同步的代碼塊(復(fù)合操作)進(jìn)行訪問(wèn)?;コ庑砸卜Q為操作的原子性
可見(jiàn)性
必須確保在鎖被釋放之前,對(duì)共享變量所做的修改,對(duì)于隨后獲得該鎖的另一個(gè)線程是可見(jiàn)的(即在獲得鎖時(shí)應(yīng)獲得最新共享變量的值),否則另一個(gè)線程可能是在本地緩存的某個(gè)副本上繼續(xù)操作從而引起不一致。
同步方法(分普通方法和靜態(tài)方法)
用法:只需要在方法上面添加synchronized關(guān)鍵字即可。
同步普通方法:只能作用在單例上面,如果不是單例,同步方法鎖將失效。
同步靜態(tài)方法:不管你有多少個(gè)類實(shí)例,同時(shí)只有一個(gè)線程能獲取鎖進(jìn)入這個(gè)方法。
同步對(duì)象實(shí)例
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(); } }
同步類
鎖效果與同步靜態(tài)方法一樣,都是類級(jí)別的鎖,同時(shí)只有一個(gè)線程能訪問(wèn)帶有同步類鎖的方法。
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實(shí)例
與同步塊的用法一致,表示鎖住整個(gè)當(dāng)前對(duì)象實(shí)例,只有獲取到這個(gè)實(shí)例的鎖才能進(jìn)入這個(gè)方法。
private static int m = 0; public void test2() { try { synchronized (this) { TimeUnit.MINUTES.sleep(2); m++; } } catch (InterruptedException e) { e.printStackTrace(); } }4. synchronized底層語(yǔ)義原理
可通過(guò)工具jconsole和jstack去觀察synchronized的底層以及線程情況。
方法鎖:
方法鎖就是由關(guān)鍵字ACC_SYNCHRONIZED實(shí)現(xiàn)是否互斥方法,
對(duì)象鎖:
monitor:在jvm規(guī)范中每個(gè)對(duì)象和類在邏輯上都是和一個(gè)監(jiān)視器(monitor)相關(guān)聯(lián)的,為了實(shí)現(xiàn)監(jiān)視器的排他性監(jiān)視能力,JVM為每一個(gè)對(duì)象和類都關(guān)聯(lián)一個(gè)鎖,鎖住了一個(gè)對(duì)象,這就是獲得對(duì)象相關(guān)聯(lián)的監(jiān)視器。
實(shí)現(xiàn)原理:某一個(gè)線程占有這個(gè)對(duì)象的時(shí)候,首先monitor的計(jì)數(shù)器是不是0,如果是0表示還沒(méi)有線程占有這個(gè)時(shí)候線程占有這個(gè)對(duì)象,并且對(duì)這個(gè)對(duì)象的monitor+1;如果不為0表示這個(gè)對(duì)象已經(jīng)被其他線程占有,這個(gè)線程等待。當(dāng)線程釋放占有權(quán)的時(shí)候monitor-1。
注:同一個(gè)線程可以對(duì)同一個(gè)對(duì)象多次加鎖,+1,+1,重入鎖
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/75905.html
摘要:多線程編程這篇文章分析了多線程的優(yōu)缺點(diǎn),如何創(chuàng)建多線程,分享了線程安全和線程通信線程池等等一些知識(shí)。 中間件技術(shù)入門教程 中間件技術(shù)入門教程,本博客介紹了 ESB、MQ、JMS 的一些知識(shí)... SpringBoot 多數(shù)據(jù)源 SpringBoot 使用主從數(shù)據(jù)源 簡(jiǎn)易的后臺(tái)管理權(quán)限設(shè)計(jì) 從零開(kāi)始搭建自己權(quán)限管理框架 Docker 多步構(gòu)建更小的 Java 鏡像 Docker Jav...
摘要:基本元素機(jī)制需要幾個(gè)元素來(lái)配合,分別是臨界區(qū)對(duì)象及鎖條件變量以及定義在對(duì)象上的,操作。這個(gè)外部條件在機(jī)制中稱為條件變量。提供的機(jī)制,其實(shí)是,等元素合作形成的,甚至說(shuō)外部的條件變量也是個(gè)組成部分。 monitor的概念 管程,英文是 Monitor,也常被翻譯為監(jiān)視器,monitor 不管是翻譯為管程還是監(jiān)視器,都是比較晦澀的,通過(guò)翻譯后的中文,并無(wú)法對(duì) monitor 達(dá)到一個(gè)直觀的描...
摘要:使用可以禁止的指令重排,保證在多線程環(huán)境下也能正常運(yùn)行。關(guān)鍵字底層原理總結(jié)關(guān)鍵字底層原理屬于層面。另外在中引入了自適應(yīng)的自旋鎖。自適應(yīng)的自旋鎖帶來(lái)的改進(jìn)就是自旋的時(shí)間不在固定了,而是和前一次同一個(gè)鎖上的自旋時(shí)間以及鎖的擁有者 【強(qiáng)烈推薦!非廣告!】阿里云雙11褥羊毛活動(dòng):https://m.aliyun.com/act/team1111/#/share?params=N.FF7yxCc...
摘要:近段時(shí)間在準(zhǔn)備實(shí)習(xí)的面試,在網(wǎng)上看到一份面試題,就慢慢試著做,爭(zhēng)取每天積累一點(diǎn)點(diǎn)?,F(xiàn)在每天給自己在面試題編寫的任務(wù)是題,有時(shí)候忙起來(lái)可能就沒(méi)有時(shí)間寫了,但是爭(zhēng)取日更,即使當(dāng)天沒(méi)更也會(huì)在之后的更新補(bǔ)上。 ????近段時(shí)間在準(zhǔn)備實(shí)習(xí)的面試,在網(wǎng)上看到一份面試題,就慢慢試著做,爭(zhēng)取每天積累一點(diǎn)點(diǎn)。????暫時(shí)手頭上的面試題只有一份,題量還是挺大的,有208題,所以可能講的不是很詳細(xì),只是我自...
摘要:今天給大家總結(jié)一下,面試中出鏡率很高的幾個(gè)多線程面試題,希望對(duì)大家學(xué)習(xí)和面試都能有所幫助。指令重排在單線程環(huán)境下不會(huì)出先問(wèn)題,但是在多線程環(huán)境下會(huì)導(dǎo)致一個(gè)線程獲得還沒(méi)有初始化的實(shí)例。使用可以禁止的指令重排,保證在多線程環(huán)境下也能正常運(yùn)行。 下面最近發(fā)的一些并發(fā)編程的文章匯總,通過(guò)閱讀這些文章大家再看大廠面試中的并發(fā)編程問(wèn)題就沒(méi)有那么頭疼了。今天給大家總結(jié)一下,面試中出鏡率很高的幾個(gè)多線...
閱讀 1177·2021-09-22 16:04
閱讀 1556·2019-08-30 15:43
閱讀 1183·2019-08-29 14:01
閱讀 3498·2019-08-26 12:19
閱讀 3414·2019-08-26 12:15
閱讀 1502·2019-08-26 12:13
閱讀 3325·2019-08-23 17:00
閱讀 1556·2019-08-23 15:38