A
Anton87
Gast
Hallo! Sitze seit Stunden an meinem Code und kriege es nicht hin :-(
Meine Klasse RWMonitor soll zulassen, dass verschiedene Threads auf dasselbe Objekt gleichzeitig Lesesperren ( mode='r' halten können. Aber es ist verboten das gleichzeig zu der Lesesperre die Schreibsperre mod ='w' gehalten wird. Die Threads müssen sozusagen zerstückelt das Programm ablaufen...
Der Fehler liegt denke ich in der lock() bzw unlock() Methode. Aber bloss wo....??
Die Trw Klasse erzeugt ein RWMonitor und 4 Threads. In der run() Mehtode soll mit zeitlicher Verzögerung jeweils die Schreibsperre bzw. Lesesperre gesetzt und freigegeben werden..
Was mache ich falsch?
Hat jemand einen Tipp? :roll:
Meine Klasse RWMonitor soll zulassen, dass verschiedene Threads auf dasselbe Objekt gleichzeitig Lesesperren ( mode='r' halten können. Aber es ist verboten das gleichzeig zu der Lesesperre die Schreibsperre mod ='w' gehalten wird. Die Threads müssen sozusagen zerstückelt das Programm ablaufen...
Der Fehler liegt denke ich in der lock() bzw unlock() Methode. Aber bloss wo....??
Die Trw Klasse erzeugt ein RWMonitor und 4 Threads. In der run() Mehtode soll mit zeitlicher Verzögerung jeweils die Schreibsperre bzw. Lesesperre gesetzt und freigegeben werden..
Was mache ich falsch?
Hat jemand einen Tipp? :roll:
Code:
public class RWMonitor extends Thread implements Runnable {
static char mode;
static Integer anzahlLeseSperre = 0;
static boolean schreibSperre = false;
public static synchronized void lock(Thread t, char mode){
//Setzen der Lesesperre
if ( mode=='r')
{
if(schreibSperre == false) {anzahlLeseSperre++;}}
else{
while(schreibSperre != false ){
try{Thread.sleep(10);}
catch( InterruptedException e)
{System.out.println("Ein Fehler ist aufgetreten" + e);}
}
anzahlLeseSperre++;}
//Setzen der Schreibsperre
if( mode =='w')
if(schreibSperre == false && anzahlLeseSperre == 0) {schreibSperre = true;}
else{
while(schreibSperre!= false && anzahlLeseSperre > 0){
try{Thread.sleep(10); }
catch( InterruptedException e)
{System.out.println("Es ist ein Fehler aufgetreten" + e);}
}
schreibSperre = true;}
}
public static synchronized void unlock(Thread t, char mode){
//Entsperren der Lesesperre
if ( mode=='r')
if(anzahlLeseSperre!=0)
{anzahlLeseSperre--; schreibSperre = false;}
//Entsperren der Schreibsperre
if( mode =='w')
if(schreibSperre == true) schreibSperre = false;
}
}
Code:
import java.lang.Math;
public class Trw extends Thread {
//RWMonitor mon;
public static void main (String [] arg){
//RWMonitor mon = new RWMonitor();
Trw t1 = new Trw();
Trw t2 = new Trw();
Trw t3 = new Trw();
Trw t4 = new Trw();
t1.start();
t2.start();
t3.start();
t4.start();
}
public void run(){
//int counter=0;
char [] mode = {'r','w'};
for (int z = 0;z<5;z++){
// Punkt 1.
try{Thread.sleep((long)(Math.random()*50+1));}
catch(InterruptedException e){
System.out.println("Ein Fehler"+ e);}
// Punkt 2.
RWMonitor.mode = mode [(int)(Math.random()*2)];
System.out.println(currentThread().getName()+
" steht vor Eintritt " + "Mode = "+ RWMonitor.mode+" "+RWMonitor.anzahlLeseSperre+RWMonitor.schreibSperre);
RWMonitor.lock(currentThread(), RWMonitor.mode);
System.out.println(currentThread().getName()+
" hat betreten " + "Mode = "+ RWMonitor.mode+" "+ RWMonitor.anzahlLeseSperre+RWMonitor.schreibSperre);
try{Thread.sleep((long)(Math.random()*50+1));}
catch(InterruptedException e){
System.out.println("Ein Fehler"+ e);}
RWMonitor.unlock(currentThread(), RWMonitor.mode);
System.out.println(currentThread().getName()+
" steht vor Verlassen " + "Mode = "+ RWMonitor.mode+" "+RWMonitor.anzahlLeseSperre+RWMonitor.schreibSperre);
}
}
}