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

代码如下

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 は内部オブジェクトをロックするため、m4t2 は synchronize(inner) を行わず、ロック ルールに準拠しようとしません

いいねを押す +0
Ty80

m4t2 メソッドをこれに変更します

リーリー

このインナーロックが効果的です。

現在の m4t2 メソッドはロックを取得せずに実行できるため、ロックの機能は、マルチスレッド実行中にロックの実行を必要とするコードの順序を保証することです。ロックは必要ありません。実行できるコードに制限はありません。

いいねを押す +0
黄舟

Thread3 にアクセスする t2 の m4t2 メソッドは同期メソッドではないため、これはインナーとは関係ありません。したがって、インナーオブジェクトのロックを取得する必要がないため、ロックキューには入りません。とても自由で、独立した個人です

いいねを押す +0
黄舟

ロック オブジェクトとオブジェクト インスタンスはヒープ内に一緒に存在せず、ロック オブジェクトは「オブジェクト ヘッダー」内にあります。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート