java - 这段代码中内部类inner的对象锁起到的作用?
高洛峰
高洛峰 2017-04-17 17:56:08
0
4
364

代码如下

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()=4
t2 : Inner.m4t2()=4
t1 : Inner.m4t1()=3
t2 : Inner.m4t2()=3
t1 : Inner.m4t1()=2
t2 : Inner.m4t2()=2
t1 : Inner.m4t1()=1
t2 : Inner.m4t2()=1
t1 : Inner.m4t1()=0
t2 : Inner.m4t2()=0

对于在m4t1中的对象锁,我不是很理解, 传入m4t1(),m4t2()的是同一个inner对象,m4t1已经将对象inner锁住, 为什么t2还可以访问m4t2呢? 希望可以有大神详细解释一下, 谢谢

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回覆(4)
大家讲道理

因為synchronized鎖的是inner對象,m4t2沒去synchronized(inner)所以也不會去試圖遵守鎖的規則

Ty80

你把m4t2方法改成這樣

private void  m4t2(Inner inner) {
    synchronized(inner) {
        inner.m4t2();
    }
}

這個inner鎖才起效果。

因為你現在的m4t2方法是不需要拿鎖就可以執行的,鎖起的作用是保證對需要拿鎖才能執行的程式碼在多執行緒執行的時候能保證順序,對於不需要拿鎖就可以執行的代碼是不受限制的。

黄舟

這裡跟inner 沒有關係 因為 t2訪問Thread3的m4t2方法不是一個 synchronized 方法 所以不需要獲得inner對象的鎖,所以不會進入鎖隊列 所以很自由 是一個單獨的個體

黄舟

鎖物件和物件實例在堆中不是在一起的,鎖物件在「物件頭」中。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板