public class Test {public static void main(String[] args) {
final TestRun run = new TestRun();
Thread thread = new Thread(run);
Thread thread2 = new Thread(run);
thread.start();
thread2.start();
}}class TestRun implements Runnable {public Integer i = 0;
public Object lock = new Object();
@Override
public void run() {
synchronized (i) {
i++;
System.out.println("step1:" + i);
i++;
System.out.println("step2:" + i);
}
}}運(yùn)行的結(jié)果。按理說,鎖住了i對(duì)象,同步快中的內(nèi)容順序執(zhí)行,結(jié)果為:step1:1step2:2step1:3step2:4但結(jié)果卻是:step1:1step1:2step2:3step2:4或者step1:1step2:3step1:2step2:4貌似沒有鎖住。當(dāng)改為synchronized (lock){……}結(jié)果就正常了!為什么????鎖住對(duì)象了,不能對(duì)對(duì)象進(jìn)行操作嗎?
2 回答

BIG陽(yáng)
TA貢獻(xiàn)1859條經(jīng)驗(yàn) 獲得超6個(gè)贊
原因是Java的自動(dòng)封箱和解箱操作在作怪。
這里的i++實(shí)際上是i = new Integer(i+1),所以執(zhí)行完i++后,i已經(jīng)不是原來的對(duì)象了,同步塊自然就無效了。
其它基本類型的封裝類,如Short、Long等等也不能作為同步對(duì)象
添加回答
舉報(bào)
0/150
提交
取消