この記事では、Java Multithreadingの同期されたキーワードに関するいくつかの知識ポイントをオブジェクトロックとして紹介します。
いわゆるオブジェクトロックは、特定のオブジェクトをロックするように同期したことを意味します。参考までに、この記事を参照してください
1。分析
同期は、次のようにインスタンスメソッドを変更できます。
public class myobject {同期されたpublic void methoda(){//何かをする....}ここでは、同期されたキーワードが現在のオブジェクトをロックします。これはオブジェクトロックとも呼ばれます。
なぜ現在のオブジェクトをロックするのですか? Methoda()はインスタンスメソッドであるため、Methoda()を実行する場合は、オブジェクトの形で呼び出す必要があります。 method()(obj.methoda()、objはmyobjectクラスのオブジェクトであり、同期はOBJオブジェクトをロックすることを意味します)。
上記のコードは次のように書くこともできます。
public class myobject {public void methoda(){synchronized(this){// do something ....}}2。機能
同期されたキーワード同期の明らかな機能は、複数の同期された変更されたインスタンスメソッドがMyobjectクラスで定義されている場合、複数のスレッドがMyobjectクラスと同じオブジェクトを持っている場合、これらのメソッドは同期的にのみ実行できることです。つまり、同期された変更方法を実行した後、別の同期変更方法を実行できます。
次のように:
public class myobject {同期public public void methoda(){//何かをします....} synchronized public void methodb(){//他のことを行う}}}Myobjectクラスには、2つの同期変更方法があります。
public class threadaはスレッドを拡張します{private myobject object; // constructor @override public void run(){super.run(); object.methoda(); }}スレッドAはmethoda()を実行します
public class threadb拡張スレッド{private myobject object; // constructor @override public void run(){super.run(); object.methodb(); }}スレッドBはmethodb()を実行します
public class run {public static void main(string [] args){myobject object = new Myobject(); //スレッドAとスレッドbは同じオブジェクトを保持します:オブジェクトスレッドa = new Threada(object); threadb b = new shoodb(object); a.start(); b.Start(); }}スレッドAとスレッドBは同じMyobjectクラスのオブジェクトオブジェクトを保持するため、これらの2つのスレッドは異なる方法を呼び出す必要がありますが、同期する必要があります。たとえば、スレッドBは、MethodB()メソッドを実行する前に、Thread AがMethoda()メソッドを実行するのを待つ必要があります。
3。結論
上記からわかるように、この記事で説明する同期ロックの範囲はオブジェクト全体です。クラスに複数の同期された変更された同期メソッドがあり、複数のスレッドがクラスの同じオブジェクト(クラスの同じオブジェクト)を保持している場合、それらは異なる方法を呼び出しますが、各メソッドの実行も同期されます。
各同期メソッド間に共有変数がない場合、または各メソッド間に接続がない場合、同期的にのみ実行することができない場合、これは効率に影響します。
4。アプリケーション - データの矛盾のために汚いデータの読み取りを避けるために同期した使用
次の例:
public class myobject {private string username = "b";プライベート文字列パスワード= "BB";同期されたpublic void methoda(string username、string password){this.username = username; try {thread.sleep(5000); } catch(arternedexception e){} this.password = password; } synchronized public void methodb(){system.out.println( "username" + username + ":" + "password" + password); }}Methoda()は、ユーザー名とパスワードの変更を担当します。実際には、ユーザー名はパスワードに対応します。
methodb()は、ユーザー名とパスワードを読み取る責任があります。
Methodb()が同期して変更されていない場合、Methoda()を呼び出すときにユーザー名を変更し、何らかの理由でCPUを放棄します(9行目での睡眠など)。
この時点で、スレッドBがMethodB()を実行する場合、ユーザー名の読み取りはスレッドA( "A")によって変更されたユーザー名ですが、パスワードは元のパスワード( "BB")です。スレッドAは眠っていて、パスワードを変更する時間がなかったためです。
ただし、methodb()が同期して変更された場合、スレッドBは、ユーザー名とパスワードを読み取るためにMethodBを実行する前に、スレッドAが完了する(つまり、ユーザー名とパスワードを変更した)のみ待機できます。したがって、データの矛盾によって引き起こされる汚い読みの問題は回避されます。
上記はこの記事に関するものです。誰もがJavaプログラミングを学ぶことが役立つことを願っています。