この質問を初めて見たとき、同期とロックがロックの点で非常に異なっていると感じたので、始めることができませんでした。たとえば、通常の状況で同期したときにロックする方法を参照してください。
方法1:
public synchronized void a(){// todo}方法2:
public void b(){synchronized(this){// todo}}これらの2つの方法から、{}の間にロックが追加されます。ロックがどのように行われるかを見てみましょう:
public void c(){lock.lock(); try {// todo}最後に{lock.unlock(); }}このロック方法は、lock()とlock()の間に追加されます。したがって、ロック関数を実装する場合は、これら2つのメソッドを実装する方法を考える必要があります。Lock()とUnlock()メソッドは、最初にフレームワークを次のように定義します。
public void lock(){} public void lock(){}次に、同期してこれらの2つの方法を実装する方法について考える必要があります。
今、私は私の心の中でもう少し明確ですが、これらの2つの方法を埋める方法がわかりません。 Lockのロックの特性を分析してから、このコードをご覧ください。
public void c(){lock.lock(); //現在のスレッドがロックを取得すると、他のスレッドが待機する必要があります{//現在のスレッドはロックに入り、他のスレッドは// todo}に入ることができません}このコードに少しコメントを追加しただけで、他に何もしませんでした。このコードを理解し、最も頻繁な言葉が何であるかを確認するのに役立ちますか?ロック()とUnlock()メソッドを埋めるとき、ソリューションを見つけるために現在の読み取りキーワードを把握することに注意する必要がありますか?答えはイエスです。
次に、分析して、同期を使用したときにスレッドを待機させる方法は? wait()メソッドを使用することです。スレッドを起こす方法は? notify()メソッドを使用します。次に、lock()メソッドでwait()メソッドとnolock()メソッドでnotify()メソッドを使用する必要があります。したがって、wait()とnotify()を使用すると、状態があります。私たちは状態として何を使うべきかを考えますか?
現在のロックが判断条件として占有されているかどうかを使用する必要があります。ロックが占有されている場合、CurrentThreadが待機します。同期しているときにこの状態を使用しているかどうかを考えてください。答えはイエスです。
ロックをいつリリースするか、どの条件を使用するかを分析しましょう。スレッドAがロックを取得した場合、スレッドBをリリースできますか?もちろん違います。 Bをリリースできる場合、もちろん原則に違反します。スレッドAのロックはリリースできることは間違いありません。したがって、判断条件は、ロックを保持しているスレッドがCurrentThreadであるかどうかを判断することです。もしそうなら、それはリリースできますが、もちろんそれはできません。
今すぐ完全なコードを見てみましょう。
パッケージtest.lock; import java.util.random; import java.util.concurrent.executorservice; import java.util.concurrent.executors; import java.util.concutors; import java.util.concurrent.threadfactory; public class naivelock {private long none = -neny none none none none none none none none none only同期void lock(){long currentthreadid = thread.currentthread()。getId(); if(owner == currentThreadId){shrow new lilegalstateException( "lockは現在のスレッドによって取得されました");} {wait();} catch(arturnedexception e){e.printstacktrace();}} and currentthreadid; system.out.println(string.format( "lockはshood%sによって取得されます"、所有者);} public synchronized void nolock(){if() IllegalStateException( "ロックのみがロックのロックを解除できます");} System.out.println(string.format( "スレッド%sは解除されています"、所有者)); system.out.println(); owner = none; notify();} public static void main(string [] args){final naivelock = new naivelock = new naiveLock(); executors.newfixedthreadpool(20、new threadfactory(){private threadgroup( "test thread group"); {group.setdaemon(true);}@override public thread newthread(runnable(runnable) {@Override public void run(){lock.lock(); system.out.println(string.format( "thread%sが実行されています..."、shood.currentthread()。getId())); dry {swree.sleep(new random()。 {e.printstacktrace();} lock.unlock();}});}}}}それを実行して結果を確認してください:
ロックはスレッド8スレッド8が実行されています...スレッド27が待機ロックスレッド26が待機ロックスレッド25が待機ロックスレッド22が待機ロックスレッド22です22は待機ロックスレッド22です27スレッド27は実行されています...スレッド27のロック解除ロックはスレッド26によって取得されます26スレッド26は実行されています...スレッド26はスレッド25によって取得されます25スレッド25は実行されています...スレッド24スレッド24によってロックが解除されますスレッド20スレッド20が実行されています...スレッド20はロックロックを解き放つスレッド19スレッド19が実行されています19は実行されています19はスレッド18スレッド18が実行されています18は実行されています...スレッド17スレッド17によってロックが解除されますスレッド13のスレッド13が実行されています...スレッド13ロックロックはスレッド12で取得されます12スレッド12が実行されています...スレッド12がスレッド11によって取得されます11スレッド11は実行されています...スレッド11はスレッド10スレッド10が実行されています。
forループを30回変更する場合は、結果を確認してください。
ロックはスレッド8スレッド8が実行されています...スレッド27が待機ロックスレッド26が待機ロックスレッド25が待機ロックスレッド22が待機ロックスレッド22です22は待機ロックスレッド22です27スレッド27は実行されています...スレッド8が待機ロックロックスレッド27がスレッドで取得されます27スレッド27は実行されています27が実行されています...スレッド27はスレッド27スレッド27によって取得されます27は27が実行されています...スレッド25はロックスレッド24によって取得されます待機ロックスレッド22ロックロックはスレッド22スレッド22が実行されているスレッドで取得されます...スレッド22はロックスレッド22がスレッド22スレッドで取得されます。スレッド22が実行されています...スレッドスレッド22はスレッド22スレッド22のロックが解除されています。スレッドスレッド19はロック22のロック解除ロックが解除されます。スレッド16スレッド16が実行されています...スレッド16ロックロックはスレッド15によって取得されます15スレッド15が実行されています...スレッド15はスレッド14によって取得されます14スレッド14が実行されています...スレッド13スレッド13によってロックが解除されます13スレッド13が実行されています...スレッド13はロック解除されます12スレッド12は実行されています12は実行されていますスレッド9スレッド9が実行されています...スレッド9が解除されていますロックはスレッド8スレッド8が実行されています。スレッド8はスレッド26によって獲得されます26スレッド26が実行されています...スレッド25がロックが解除されます25スレッド25は実行されています...スレッド25は獲得されますスレッド21によって取得されたスレッド21が実行されています...スレッド21のロック解除ロックはスレッド20スレッド20が実行されています...スレッド20はロックロックが解除されます19スレッド19が実行されています19は実行されています19はロック解除ロック18スレッド18です。
要約します
上記は、同期してロックコードを実装するために同期していることに関するこの記事のすべての詳細な説明です。私はそれが誰にでも役立つことを願っています。興味のある友達は引き続きこのサイトを参照できます:
Javaスレッド同期ロック同期ロックコードの例
Javaプログラミングの同期とロックの違い[推奨]
Java Multithreaded ReadWritelock Read-Write分離実装コード
欠点がある場合は、それを指摘するためにメッセージを残してください。このサイトへのご支援をありがとうございました!