いくつかの Web ページのロックについて読んでいて、あるサイトで説明されている基本的なケースを実行しようとしました。私はスレッドの使用に慣れていないので、これがコードがファイルを探す方法です。
1) 読み書きロック機能 (非再入可能、非常に基本的)
public ReadWriteLock() {
// TODO Auto-generated constructor stub
}
synchronized void readLock(String name) throws InterruptedException {
//tname = threadName;
if(writers>0 || writereq>0){
wait();
}
readers++;
System.out.println(name + " locks for reading resource....");
}
synchronized void readUnLock(String name) throws InterruptedException{
//tname = threadName;
readers--;
System.out.println(name + "unlocks reading resource....");
notifyAll();
}
synchronized void writeLock(String name) throws InterruptedException{
//tname = threadName;
writereq++;
if(writers>0 || readers>0){
System.out.println( name + " waits for writing...");
wait();
}
writereq--;
writers++;
System.out.println(" locks for writing resource....");
}
synchronized void writeUnLock(String name) throws InterruptedException{
//tname = threadName;
writers--;
System.out.println(name + " unlocks for writing resource....");
notifyAll();
}
2) Runnable インターフェースの実装、
public class Runner implements Runnable{
private ReadWriteLock rwl;
private String name;
public Runner(ReadWriteLock rwl, String name) {
// TODO Auto-generated constructor stub
this.rwl=rwl;
this.name = name;
}
void runlocks(int method){
//String name = Thread.currentThread().getName();
switch(method){
case 1:
try {
rwl.readLock(name);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}break;
case 2:
try {
rwl.readUnLock(name);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} break;
case 3:
try {
rwl.writeLock(name);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} break;
case 4:
try {
rwl.writeUnLock(name);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} break;
}
}
@Override
public void run() {
//String name = Thread.currentThread().getName();
// TODO Auto-generated method stub
//System.out.println("Thread started "+ name);
//int method = 1;
// TODO Auto-generated method stub
//System.out.println(this.threadName + " has started!");
}
3) テストコール
public class TestClass {
public static void main(String[] args) throws InterruptedException {
ReadWriteLock rwl = new ReadWriteLock();
Runner r1 =new Runner(rwl,"Thread1");
Thread t1 = new Thread(r1);
t1.setName("Thread1");
Runner r2 =new Runner(rwl,"Thread2");
Thread t2 = new Thread(r2);
t2.setName("Thread2");
t1.start();
t2.start();
r1.runlocks(1); //r1 locks to read
r2.runlocks(1); //r2 locks to read
r1.runlocks(2); //r1 unlocks read
r2.runlocks(2); //r1 unlocks read
r1.runlocks(3); //r1 locks to write
r2.runlocks(1); //r2 tries to lock for read but waits.. and the code gets struck here
r1.runlocks(4); //r1 releases lock of write
}
}
私の質問は..テスタークラスでは、スレッド1が書き込みロックを取得し、次にスレッド2が読み取りを試みますが、それは傾斜して待機します..この時点で、スレッド1が書き込みロックをロック解除する次のステートメントを実行し、スレッド2を実行する必要があります自然にロックを読み取るようになります..しかし、このシナリオは起こりません.理解するのに欠けているものはありますか?