[ java 鎖 - 04 - Integer o = 1 作為 鎖的問題]
關(guān)于 Integer 作為鎖對(duì)象的風(fēng)險(xiǎn)總結(jié)
核心結(jié)論
Integer(如 Integer lock = 1;)不適合作為 synchronized 的鎖對(duì)象,因緩存復(fù)用和不可變性導(dǎo)致同步邏輯失效。
關(guān)鍵風(fēng)險(xiǎn)點(diǎn)
-
緩存復(fù)用導(dǎo)致鎖沖突
Java 對(duì)[-128, 127]范圍內(nèi)的Integer實(shí)現(xiàn)緩存池復(fù)用,不同變量(如lockA = 1和lockB = 1)會(huì)指向同一對(duì)象。
→ 后果:無關(guān)線程競(jìng)爭(zhēng)同一把鎖,破壞同步隔離性,降低并發(fā)效率。 -
不可變性引發(fā)鎖替換
Integer是不可變類,若對(duì)鎖對(duì)象重新賦值(如lock = 2),會(huì)導(dǎo)致鎖引用指向新對(duì)象。
→ 后果:同步塊實(shí)際鎖定的對(duì)象變化,多個(gè)線程可同時(shí)進(jìn)入臨界區(qū),破壞線程安全。
final 修飾的局限性
- 加
final(final Integer lock = 1)可避免鎖被替換,但無法解決緩存復(fù)用問題(仍可能與其他Integer(1)鎖沖突)。
正確替代方案
使用 final Object 作為鎖對(duì)象:
private final Object lock = new Object(); // 最優(yōu)解
- 唯一性:
new Object()每次創(chuàng)建獨(dú)立實(shí)例,無緩存復(fù)用,確保鎖隔離。 - 穩(wěn)定性:
final修飾保證引用不可修改,避免鎖替換。
總結(jié)
Integer 因緩存機(jī)制和不可變性,存在鎖沖突和替換風(fēng)險(xiǎn),不適合作為鎖對(duì)象。優(yōu)先使用 final Object,從根源上避免同步問題。

浙公網(wǎng)安備 33010602011771號(hào)