国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

JUC之synchronized

2019-11-14 11:03:53
字體:
供稿:網(wǎng)友

簡介

synchronizedjava語言的一個(gè)關(guān)鍵字,用來修飾一個(gè)方法或者代碼塊,使得目標(biāo)達(dá)到線程同步的目的。

當(dāng)我們希望某個(gè)方法或者代碼塊,同一時(shí)間只能有一個(gè)線程能夠執(zhí)行,即是同一時(shí)間只有一個(gè)線程能夠進(jìn)入該方法或者代碼塊,其它線程將會(huì)被阻塞直接原線程執(zhí)行結(jié)束,此時(shí)我們使用該關(guān)鍵字。

用法

由上面的簡介可以可得synchronized的兩種用法,如下:

public synchronized void bar() { ...}public void foo() { synchronized(this) { ... }}

1. 修飾方法

當(dāng)用synchronized修飾方法時(shí),此時(shí)其功能相當(dāng)于

public void foo() { synchronized(this) { ... }}

為此,我還特意看來了一下java生成class文件,發(fā)現(xiàn)對這兩份代碼生成字節(jié)碼并不一樣。那們?yōu)槭裁磿?huì)這兩種方式,我個(gè)人認(rèn)為原因有二,當(dāng)synchronized(this)的范圍從方法的第一行到最后一行時(shí),直接用synchronized修飾方法就是一種偷懶方式;其次,synchronized(this)可以有控制更小的粒度,既是只要圈住需要同步的代碼可以減少的鎖持有時(shí)長,提高TPS。

如果您有更準(zhǔn)確解釋,希望您能在文后評論,謝謝

2. 修飾代塊碼

通過修飾代塊碼方式來實(shí)現(xiàn)同步的目標(biāo)時(shí),相比修飾方法有兩個(gè)優(yōu)勢。 1. 只需要圈住(保護(hù))應(yīng)該圈住的代碼塊。被圈住的部分才會(huì)同步,其它使臨界區(qū)的訪問盡可能的短,從獲得更好的性能。 2. 通引用傳入的變量作為同步的標(biāo)量,它允許同一時(shí)刻有多個(gè)線程同時(shí)進(jìn)入同步塊,當(dāng)它的變量值不同時(shí)。反過來,同一時(shí)刻且同一個(gè)變量值,只允許一個(gè)線程進(jìn)入同步塊

PRivate Object v = new Object;public void foo() { synchronized(v) { System.out.println(Thread.currentThread().getId() + ", enter"); try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { } System.out.println(Thread.currentThread().getId() + ", leave"); }}public void bar() { new Thread(() -> { foo(); }).start(); new Thread(() -> { foo(); }).start()}它結(jié)果應(yīng)該是(發(fā)生阻塞)0, enter0, leave1, enter1, leave

接下來我們稍微變一下,會(huì)出現(xiàn)一個(gè)不同的結(jié)果

public void bar() { new Thread(() -> { v = "123"; foo(); }).start(); new Thread(() -> { v = "321"; foo(); }).start()}它結(jié)果是不發(fā)生阻塞的

思考

當(dāng)傳入的是v = 1會(huì)怎么這樣呢?

當(dāng)引用的是一個(gè)靜態(tài)不可變變量(即static final Object v = new Object())?

提示1,Integer a = 1; Integer b = 1;此時(shí),a == b為true。當(dāng)Integer在-128~127是全局都是同一個(gè)引用變量。 提示2,ClassLoader。

FAQ

如下這些細(xì)節(jié)找不到引入理由但又感得這些內(nèi)容非常有價(jià)值,便用FAQ的方式強(qiáng)行帶入。

能否在synchronized修飾的方法或代碼塊中發(fā)生線程上下文切換? ——能。簡述synchronized具有可重入性。 ——在synchronized的方法或代碼塊內(nèi)可以調(diào)用另一個(gè)帶有synchronized的方法或代碼塊,而不發(fā)生死鎖。所有變量v寫操作都發(fā)生synchronized代碼塊里,此時(shí)如果讀操作不在synchronized代碼塊里,會(huì)怎么樣呢? ——此時(shí)變量v為弱一致性。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 西平县| 青浦区| 弥渡县| 武清区| 中西区| 沙洋县| 东方市| 嘉峪关市| 迁西县| 长汀县| 通辽市| 金秀| 昔阳县| 定州市| 滨海县| 泾源县| 鄂托克旗| 资溪县| 射洪县| 离岛区| 田林县| 仁化县| 太湖县| 余江县| 桃江县| 仲巴县| 阳谷县| 赤壁市| 巩留县| 兴业县| 咸丰县| 嘉峪关市| 平陆县| 惠安县| 旺苍县| 宜都市| 辽宁省| 通道| 凤凰县| 三河市| 南宁市|