Java 中的synchronized鎖代碼塊的時(shí)候需不需要這個(gè)類是單例
問(wèn)題描述
當(dāng)它鎖定一個(gè)方法或者一個(gè)代碼塊的時(shí)候,同一時(shí)刻最多只有一個(gè)線程執(zhí)行這段代碼。當(dāng)兩個(gè)并發(fā)線程訪問(wèn)同一個(gè)對(duì)象object中的這個(gè)加鎖同步代碼塊時(shí),一個(gè)時(shí)間內(nèi)只能有一個(gè)線程得到執(zhí)行。另一個(gè)線程必須等待當(dāng)前線程執(zhí)行完這個(gè)代碼塊以后才能執(zhí)行該代碼塊。
那問(wèn)題來(lái)了,如果兩個(gè)線程訪問(wèn)的是這個(gè)對(duì)象的不同實(shí)例,還會(huì)阻塞嗎?
問(wèn)題解答
回答1:synchronized的用法有以下三種
指定對(duì)象加鎖。類似于synchronized (instance) {}。
直接作用于實(shí)例方法。相當(dāng)于對(duì)當(dāng)前實(shí)例加鎖,進(jìn)入同步方法前要獲得當(dāng)前實(shí)例的鎖。
直接作用于靜態(tài)方法。相當(dāng)于對(duì)當(dāng)前類加鎖,進(jìn)入同步方法前獲得當(dāng)前類的鎖。
對(duì)于上面的1、2.必須是同一對(duì)象或者同一實(shí)例時(shí)才會(huì)使線程阻塞。
回答2:鎖是加在對(duì)象實(shí)例上的。加在不同對(duì)象上的鎖是不會(huì)相互影響的。兩個(gè)線程訪問(wèn)兩個(gè)不同對(duì)象,是不會(huì)相互阻塞的。
相關(guān)文章:
1. Docker for Mac 創(chuàng)建的dnsmasq容器連不上/不工作的問(wèn)題2. docker安裝后出現(xiàn)Cannot connect to the Docker daemon.3. Span標(biāo)簽4. javascript - 請(qǐng)教空白文本節(jié)點(diǎn)的問(wèn)題5. extra沒(méi)有加載出來(lái)6. css - 關(guān)于border-image7. mysql - 為什么where條件中or加索引不起作用?8. python - linux怎么在每天的凌晨2點(diǎn)執(zhí)行一次這個(gè)log.py文件9. mysql - php 如何網(wǎng)址中出現(xiàn)該頁(yè)標(biāo)題?10. django進(jìn)行數(shù)據(jù)庫(kù)的查詢
