呼啦一陣風(fēng)
2019-03-13 18:13:16
代碼如下package synchron;public class Thread3 { class Inner { private void m4t1() { int i = 5; while(i-- > 0) { System.out.println(Thread.currentThread().getName() + " : Inner.m4t1()=" + i); try { Thread.sleep(500); } catch(InterruptedException ie) { } } } private void m4t2() { int i = 5; while(i-- > 0) { System.out.println(Thread.currentThread().getName() + " : Inner.m4t2()=" + i); try { Thread.sleep(500); } catch(InterruptedException ie) { } } } } private void m4t1(Inner inner) { synchronized(inner) { //使用對象鎖 inner.m4t1(); } } private void m4t2(Inner inner) { inner.m4t2(); } public static void main(String[] args) { final Thread3 myt3 = new Thread3(); final Inner inner = myt3.new Inner(); Thread t1 = new Thread( new Runnable() {public void run() { myt3.m4t1(inner);} }, "t1"); Thread t2 = new Thread( new Runnable() {public void run() { myt3.m4t2(inner);} }, "t2"); t1.start(); t2.start(); } }輸出如下t1 : Inner.m4t1()=4t2 : Inner.m4t2()=4t1 : Inner.m4t1()=3t2 : Inner.m4t2()=3t1 : Inner.m4t1()=2t2 : Inner.m4t2()=2t1 : Inner.m4t1()=1t2 : Inner.m4t2()=1t1 : Inner.m4t1()=0t2 : Inner.m4t2()=0對于在m4t1中的對象鎖,我不是很理解, 傳入m4t1(),m4t2()的是同一個inner對象,m4t1已經(jīng)將對象inner鎖住, 為什么t2還可以訪問m4t2呢? 希望可以有大神詳細(xì)解釋一下, 謝謝
4 回答

LEATH
TA貢獻1936條經(jīng)驗 獲得超7個贊

狐的傳說
TA貢獻1804條經(jīng)驗 獲得超3個贊
你把m4t2方法改成這樣
private void m4t2(Inner inner) {
synchronized(inner) {
inner.m4t2();
}
}
這個inner鎖才起效果。
因為你現(xiàn)在的m4t2方法是不需要拿鎖就可以執(zhí)行的,鎖起的作用是保證對需要拿鎖才能執(zhí)行的代碼在多線程執(zhí)行的時候能保證順序,對于不需要拿鎖就可以執(zhí)行的代碼是不受限制的。

不負(fù)相思意
TA貢獻1777條經(jīng)驗 獲得超10個贊
添加回答
舉報
0/150
提交
取消