synchronized原理和使用

Java中獲取鎖有兩種方式哈打,一種是使用synchronized關(guān)鍵字迂苛,另外一種就是使用Lock接口的實(shí)現(xiàn)類直颅。 本文重點(diǎn)講 synchronized

synchronized是Java中的關(guān)鍵字刮便,是一種同步鎖褪秀。它修飾的對(duì)象有以下幾種:

1. 修飾一個(gè)代碼塊蓄诽,被修飾的代碼塊稱為同步語(yǔ)句塊,其作用的范圍是大括號(hào){}括起來(lái)的代碼媒吗,作用的對(duì)象是調(diào)用這個(gè)代碼塊的對(duì)象仑氛;?  

2. 修飾一個(gè)方法,被修飾的方法稱為同步方法闸英,其作用的范圍是整個(gè)方法锯岖,作用的對(duì)象是調(diào)用這個(gè)方法的象;?  

3. 修改一個(gè)靜態(tài)的方法甫何,其作用的范圍是整個(gè)靜態(tài)方法出吹,作用的對(duì)象是這個(gè)類的所有對(duì)象;?  

4. 修改一個(gè)類辙喂,其作用的范圍是synchronized后面括號(hào)括起來(lái)的部分捶牢,作用主的對(duì)象是這個(gè)類的所有對(duì)象。?

5. 類鎖和對(duì)象鎖是兩個(gè)不一樣的鎖巍耗,控制著不同的區(qū)域秋麸,它們是互不干擾的。同樣炬太,線程獲得對(duì)象鎖的同時(shí)灸蟆,也可以獲得該類鎖,即同時(shí)獲得兩個(gè)鎖亲族。

就是說(shuō)炒考,不同線程可以同時(shí)訪問(wèn)加了對(duì)象鎖和類鎖的方法

public class SynchronizedTest {

? ? /**

? ? *? synchronized (this) 鎖住代碼塊,鎖的是當(dāng)前對(duì)象

? ? */

? ? public void test1() {

? ? ? ? synchronized (this) {

? ? ? ? ? ? int i = 5;

? ? ? ? ? ? while (i-- > 0) {

? ? ? ? ? ? ? ? System.out.println(Thread.currentThread().getName() + " : " + i);

? ? ? ? ? ? ? ? sleepFuc(500);

}

}

}

? ? /**

? ? * synchronized加在成員方法上鎖的是當(dāng)前對(duì)象孽水,等價(jià)于 synchronized (this)

*/

? ? public synchronized void test2() {

? ? ? ? int i = 5;

? ? ? ? while (i-- > 0) {

? ? ? ? ? ? System.out.println(Thread.currentThread().getName() + " : " + i);

? ? ? ? ? ? sleepFuc(500);

}

}

? ? /**

? ? * 非同步方法

? ? */

? ? public? void test3() {

? ? ? ? int i = 5;

? ? ? ? while (i-- > 0) {

? ? ? ? ? ? System.out.println(Thread.currentThread().getName() + " : " + i);

? ? ? ? ? ? ? ? sleepFuc(500);

}

}

? ? /**

? ? * synchronized用在靜態(tài)方法上是類鎖方法等價(jià)于 synchronized (SynchronizedTest.class)

*/

? ? public static synchronized void test4() {

? ? ? ? int i = 5;

? ? ? ? while (i-- > 0) {

? ? ? ? ? ? System.out.println(Thread.currentThread().getName() + " : " + i);

? ? ? ? ? ? try {

? ? ? ? ? ? ? ? Thread.sleep(500);

? ? ? ? ? ? } catch (InterruptedException ie) {

}

}

}

? ? /**

? ? * 類鎖方法

? ? */

? ? public void test5() {

? ? ? ? synchronized (SynchronizedTest.class) {

? ? ? ? ? ? int i = 5;

? ? ? ? ? ? while (i-- > 0) {

? ? ? ? ? ? ? ? System.out.println(Thread.currentThread().getName() + " : " + i);

? ? ? ? ? ? ? ? sleepFuc(500);

}

}

}

? ? private void sleepFuc(int mill) {

? ? ? ? try {

? ? ? ? ? ? Thread.sleep(mill);

? ? ? ? } catch (InterruptedException ie) {

}

}

? ? public static void main(String[] args) {

? ? ? ? final SynchronizedTest test = new SynchronizedTest();

//? ? ? ? Thread test1 = new Thread(test::test1, "synchronized (this)");

? ? ? ? Thread test2 = new Thread(test::test2, "synchronized method");

//? ? ? ? Thread test3 = new Thread(test::test3, "not synchronized");

? ? ? ? Thread test4 = new Thread(SynchronizedTest::test4, "static synchronized method");

//? ? ? ? Thread test5 = new Thread(test::test5, " synchronized (SynchronizedTest.class)");

//? ? ? ? test1.start();

? ? ? ? test2.start();

//? ? ? ? test3.start();

? ? ? ? test4.start();

//? ? ? ? test5.start();

? ? }

? ? /*

? ? *? 非靜態(tài)方法:

? ? *? 給對(duì)象加鎖(可以理解為給這個(gè)對(duì)象的內(nèi)存上鎖,注意 只是這塊內(nèi)存,其他同類對(duì)象都會(huì)有各自的內(nèi)存鎖),這時(shí)-? ? ? ?*?候 在其他一個(gè)以上線程中執(zhí)行該對(duì)象的這個(gè)同步方法(注意:是該對(duì)象)就會(huì)產(chǎn)生互斥??

? ? *? 靜態(tài)方法:

? ? * 相當(dāng)于在類上加鎖(*.class 位于代碼區(qū),靜態(tài)方法位于靜態(tài)區(qū)域,這個(gè)類產(chǎn)生的對(duì)象公用這個(gè)靜態(tài)方法,所以這塊? ? ? * 內(nèi)存票腰,N個(gè)對(duì)象來(lái)競(jìng)爭(zhēng)), 這時(shí)候,只要是這個(gè)類產(chǎn)生的對(duì)象,在調(diào)用這個(gè)靜態(tài)方法時(shí)都會(huì)產(chǎn)生互斥

*/

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市女气,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌测柠,老刑警劉巖炼鞠,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異轰胁,居然都是意外死亡谒主,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門赃阀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)霎肯,“玉大人擎颖,你說(shuō)我怎么就攤上這事」塾危” “怎么了搂捧?”我有些...
    開封第一講書人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)懂缕。 經(jīng)常有香客問(wèn)我允跑,道長(zhǎng),這世上最難降的妖魔是什么搪柑? 我笑而不...
    開封第一講書人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任聋丝,我火速辦了婚禮,結(jié)果婚禮上工碾,老公的妹妹穿的比我還像新娘弱睦。我一直安慰自己,他們只是感情好渊额,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開白布况木。 她就那樣靜靜地躺著,像睡著了一般端圈。 火紅的嫁衣襯著肌膚如雪焦读。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,258評(píng)論 1 300
  • 那天舱权,我揣著相機(jī)與錄音矗晃,去河邊找鬼。 笑死宴倍,一個(gè)胖子當(dāng)著我的面吹牛张症,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鸵贬,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼俗他,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了阔逼?” 一聲冷哼從身側(cè)響起兆衅,我...
    開封第一講書人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎嗜浮,沒(méi)想到半個(gè)月后羡亩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡危融,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年畏铆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吉殃。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡辞居,死狀恐怖楷怒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情瓦灶,我是刑警寧澤鸠删,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站倚搬,受9級(jí)特大地震影響冶共,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜每界,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一捅僵、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧眨层,春花似錦庙楚、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至叁征,卻和暖如春纳账,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背捺疼。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工疏虫, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人啤呼。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓卧秘,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親官扣。 傳聞我的和親對(duì)象是個(gè)殘疾皇子翅敌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1.為什么要使用synchronized 在并發(fā)編程中存在線程安全問(wèn)題,主要原因有:1.存在共享數(shù)據(jù) 2.多線程共...
    xuxw閱讀 338評(píng)論 0 0
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法惕蹄,類相關(guān)的語(yǔ)法蚯涮,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法卖陵,異常的語(yǔ)法恋昼,線程的語(yǔ)...
    子非魚_t_閱讀 31,625評(píng)論 18 399
  • 隨著多進(jìn)程多線程的出現(xiàn)鸥滨,對(duì)共享資源(設(shè)備嗦哆,數(shù)據(jù)等)的競(jìng)爭(zhēng)往往會(huì)導(dǎo)致資源的使用表現(xiàn)為隨機(jī)無(wú)序 例如:一個(gè)線程想在控制...
    cuixiaoyan閱讀 150評(píng)論 0 0
  • 前言 上篇文章[https://blog.csdn.net/avengerEug/article/details/...
    avengerEug閱讀 263評(píng)論 0 0
  • 一老速、解決什么問(wèn)題 多線程訪問(wèn)同一對(duì)象的實(shí)例變量時(shí),避不開線程安全的問(wèn)題凸主。如果處理不當(dāng)橘券,很可能會(huì)出現(xiàn)臟讀、死鎖等問(wèn)題...
    文景大大閱讀 225評(píng)論 0 0