図1に示すように、同期してロックされたオブジェクトのメソッド
スレッドロックがオブジェクトです。
1)ホールドオブジェクトにスレッドがロックロックオブジェクト、Bスレッドは非同期に非同期メソッドの対象オブジェクトタイプを呼び出すことができ
2)スレッドは、最初のオブジェクトを保持しているロックロック、この時点でのオブジェクトの同期メソッド呼び出しのオブジェクトタイプであればBのスレッドオブジェクト、あなたが同期され、待つ必要があります。
図2に示すように、ダーティ・リード(DirtyRead)
例:
パブリック クラスDirtyReadTest { 公共 静的 ボイドメイン(文字列[]引数){ 試み{ PublicVar publicVar = 新しいPublicVar(); スレッドAスレッド = 新しいスレッドA(publicVar)。 thread.start(); Thread.sleep( 200 )。 publicVar.getValue(); } キャッチ(例外e){ e.printStackTrace(); } } 静的 クラススレッドAは、拡張スレッド{ プライベートPublicVarのpublicVarを。 パブリックスレッドA(PublicVar publicVar){ この .publicVar = publicVar。 } @オーバーライド 公共 のボイドの実行(){ スーパー.RUN(); publicVar.setValue( "B"、 "BB" )。 } } 静的 クラスPublicVar { パブリック文字列名=「A」。 公共の文字列のパスワード=「AA」; 同期 公共 のボイドのsetValue(文字列名、文字列のパスワード){ しようと{ この .username = ユーザ名を。 Thread.sleep( 1000年); このみましょう。パスワード= パスワード; System.out.println( "のsetValueメソッドのスレッド名=" +にThread.currentThread()のgetName()+ "\ tusername =" +名+ "\ tpassword =" +。パスワード); } キャッチ(例外e){ e.printStackTrace(); } } // getValueメソッドは、非同期の方法であるので、読み取り汚いを作成 公共 ボイドのgetValueを(){ System.out.println( "getValueメソッドのスレッド名=" +にThread.currentThread()のgetName()+ "\ tusername =" +名+ "\ tpassword =" +。パスワード); } } }
結果が示されています。
3、同期ロックリエントラント
「リエントラントロック」の概念は次のとおりです。
彼らは再び自分自身の内部のロックを生きることができます。例えば、オブジェクトのロックを取得するためのスレッドがある、オブジェクトのロックが解除されていませんあなたはこのオブジェクトのロックを取得したい場合、それが再びまだで取得することができ、そうでない場合はリエントラントロック、それが原因となりますデッドロック。
リエントラントロックはまた、環境に継承し、親子クラスでサポートされています:継承、サブクラスはの親クラスの同期メソッドを呼び出すことができます「リエントラントロックを。」
図4に示すように、異常な、自動ロック解除
異常なスレッドが表示されますが、現在のスレッドのロックを解除します