読み取りと書き込み:読み取りロックとライティングロックに分割されているため、複数の読み取りロックは、対応するロックを適用する必要があるため、相互に排他的にロックを読み取り、書き込みロックしません。コードがデータのみを読み取る場合、多くの人が同時に読むことができますが、同時に書くことはできません。 、次に、ロックの本質を書きます要するに、読書時にロックを読み、書くときにロックを書きます!
3つのスレッドがデータを読み取り、3つのスレッドがデータの例を記述します:
同時に読むことができます。同時に書くことはできません。同時に書くことはできません。また、書くときに読むこともできません。
ロックを読むとき、ロックを書き留めてください。
最終的にロックを解除するために注意してください。
com.ljq.test.thread。 public static void main(string [] args){final readwrite rw = new readwrite(); {rw.read();}} .start(); new shood(){space(true){rw.write(new random()。nextint(10000));}}} .start ();}} /** *相互に排他的に読み書きするので、同じクラスに置きます * * @authouse Administrator * * /class readwrite {private object data = null;データですが、データを同時に読み取るための複数のスレッドがあります。 ReadWritElock rwl = read data(){) .sleep((long)(math.random() * 1000)); {e.printstacktrace();}最後に{rwl.readlock();} / ** * @param data * / publi c void write(rwl.writeLock() ()try.out.println() .println()。getname() + " + data e){e。
キャッシュシステムの設計キャッシュシステム:データを取得する必要がある場合は、パブリックオブジェクトGetData(String Key)メソッドを確認する必要があります。 、誰かが次回このデータに到達し、データベースで見つけずにこの番号を直接返します。データのデータベースを見つけないでください、私のところに来てください。
com.ljq.thread System * * @Author Administrator * */public class cachedemo {private Map <string> cache = new Hashmap <string、object>(); cachedemo cachedemo()out.println(key); Caching} Private WriteLock rwl = reentradwritelock(){rwl.readlock(); /最初に内部メモリに値があるかどうかを確認する場合は(value == null){//データベースにアクセスしてデータベースに移動し、内部メモリで見つかった結果を保存してください//読み取りロックをリリースします、rwl.readlock()を書き込みます。 out.println( "データベースの読み取り"); Unlock();} // rw read and write rwl.readlock();}}価値;}}
バック結果: