Javaスレッドの同期は、ロジックに基本的に一致しています:ロックを追加------>変更-------->リリースロック
1。コードブロックを同期します
例は次のとおりです。
public class syncblock {static class datawrap {int i; } static class syncblockthread extends thread {private datawrap date; public syncblockthread(datawrap datawrap){this.date = datawrap; } @Override public void run(){for(int i = 0; i <10; i ++){synchronized(date){date.i ++; {sleep(1); } catch(arturnedexception e){e.printstacktrace(); } system.out.println(getname() + "" + date.i); }}}} public static void main(string [] args){// multi-thread実装変数I sequence datawrap datawrap = new Datawrap()に1つの出力を追加します。 new syncblockthread(datawrap).start(); new syncblockthread(datawrap).start(); new syncblockthread(datawrap).start(); }}この例では、整数を順番に出力する必要があります。
通常、同期コードブロックは、ロックする必要があるオブジェクトであり、通常、同時アクセスを必要とする共有リソースです。すべてのスレッドは、指定されたリソースを変更する前に、最初にリソースをロックします。ロック期間中、他のスレッドはリソースを変更できません。これにより、スレッドのセキュリティが保証されます。さらに、スレッドやイールドを呼び出すとき、スレッドはリソースロックを放棄しません。
2。同期方法
public class syncmethod {static class datawrap {int i; public synchronized void値grow(){i ++; {thread.sleep(1); } catch(arturnedexception e){// todo auto-fenated catch block e.printstacktrace(); } system.out.println(thread.currentthread()。getname() + "" + i); }} static class syncmethodthread extends thread {datawrap datawrap; public syncmethodthread(datawrap datawrap){this.datawrap = datawrap; } @Override public void run(){for(int i = 0; i <10; i ++){datawrap.valuegrow(); }}} public static void main(string [] args){//シーケンシャル成長と出力I Datawrap datawrap = new Datawrap(); new syncmethodthread(datawrap).start(); new syncmethodthread(datawrap).start(); new syncmethodthread(datawrap).start(); }}同期法は、同期されたキーワードによって変更されたメソッドです。同期メソッドは、オブジェクト自体をロックします。したがって、スレッドが特定のオブジェクトの同期メソッドを呼び出す場合、他のスレッドがオブジェクトの他の同期メソッドを呼び出す場合、オブジェクトがロックされているため、オブジェクトのロックを解放するのを待つ必要があります。
3。同期ロック
同期は、同期ロックオブジェクトを定義することによって達成されます。この場合、同期ロックはロックオブジェクトを使用して動作します。
Import java.util.concurrent.locks.lock; import java.util.concurrent.locks.reentrantlock; public class synclock {static class datawrap {lock lock = new ReentrantLock(); int i; public void valuegrow(){lock.lock(); {i ++; {thread.sleep(1); } catch(arturnedexception e){// todo auto-fenated catch block e.printstacktrace(); } system.out.println(thread.currentthread()。getname() + "" + i); }最後に{lock.unlock(); }}} static class synclockthread extends thread {datawrap datawrap; public synclockthread(datawrap datawrap){this.datawrap = datawrap; } @Override public void run(){for(int i = 0; i <10; i ++){datawrap.valuegrow(); }}} public static void main(string [] args){//シーケンシャル成長と出力I Datawrap datawrap = new Datawrap(); new synclockthread(datawrap).start(); new synclockthread(datawrap).start(); new synclockthread(datawrap).start(); }}ロックオブジェクトを使用してスレッドの同期を実装すると、より柔軟になります。一部のロックにはいくつかの特定の機能があり、その中にはより一般的に使用されるreadwritelockの読み取りおよび書き込みロックがあり、Reentrantlockはロックに再び入ります。