Synchronisationsproblem- Thread?

Das beigefügte Programm hat offenbar noch ein Synchronisationsproblem. korrigieren Sie den Java-Code. Benutzen Sie hierfür die Klasse ReentrantLock aus dem Package java.util.concurrent.locks.

public class Kasse implements Comparable<Kasse> {
	private int kassenNummer;
	private int anzahlStudenten;


	private ReentrantLock kassenMutex = new ReentrantLock(true); // Faire Warteschlange vor dieser Kasse!


	public Kasse(int num) {
		kassenNummer = num;
	}


	/*
	 * Student ruft die Methode ENTER auf --> Mutex garantiert den exklusiven
	 * Zugriff und verwaltet die Warteschlange!
	 */
	public void enter() throws InterruptedException {
		try {
			kassenMutex.lock();
			// Zahlvorgang abwarten
			bezahlen();
		} finally {
			// Kasse verlassen
			kassenMutex.unlock();
		}
	}


	// Studenten im Kassenbereich benutzen diese Methode, um zu bezahlen
	private void bezahlen() throws InterruptedException {
		int sleepTime = (int) (100 * Math.random());
		Thread.sleep(sleepTime);
	}



	public int getKassenNummer() {
		return kassenNummer;
	}



	public String getKassenName() {
		return Character.toString((char) (kassenNummer + 65));
	}
	
	
	public int getAnzahlStudenten() {
		return anzahlStudenten;
	}


	public void inkrAnzahlStudenten() {
		anzahlStudenten++;
	}


	public void dekrAnzahlStudenten() {
		anzahlStudenten--;
	}


	@Override
	public int compareTo(Kasse kasse2) {
		/* Sortiere Kassen nach Warteschlangenlaenge aufsteigend */
		return this.getAnzahlStudenten() - kasse2.getAnzahlStudenten();
	}
}


public class Mensa {
	private static final int ANZAHL_STUDENTEN = 100;
	private static final int ANZAHL_KASSEN = 3;


	public LinkedList<Kasse> kassenliste;


	private LinkedList<Student> studentenListe;


	public void starteSimulation() {
		Kasse aktKasse;
		Student aktStudent;
		int i;


		kassenliste = new LinkedList<Kasse>();
		studentenListe = new LinkedList<Student>();


		/* Kassen erzeugen */
		for (i = 0; i < ANZAHL_KASSEN; i++) {
			aktKasse = new Kasse(i);
			kassenliste.add(aktKasse);
		}
		/* Studenten erzeugen */
		for (i = 0; i < ANZAHL_STUDENTEN; i++) {
			aktStudent = new Student(String.format("Studi-%2d", i), this);
			studentenListe.add(aktStudent);
			aktStudent.start();
		}


		/* Laufzeit abwarten */
		try {
			Thread.sleep(3000);
		} catch (InterruptedException e) {
		}
		for (i = 0; i < ANZAHL_STUDENTEN; i++) {
			aktStudent = (Student) studentenListe.get(i);
			aktStudent.interrupt();
		}


		System.err.println("-------------------- THE END -------------------");
	}


	public void showScore() {
		/* Anzeige der Anzahl an Studis pro Kasse in einer Zeile */
		System.err.print(" --- Kassenliste ");
		for (int i = 0; i < ANZAHL_KASSEN; i++) {
			System.err.print(String.format("  Kasse %s: %2d", kassenliste.get(i).getKassenName(),
					kassenliste.get(i).getAnzahlStudenten()));
		}
		System.err.println();
	}


	public static void main(String args[]) {
		new Mensa().starteSimulation();
	}
}
Informatik, Softwareentwicklung, Wirtschaftsinformatik, Thread, Netbeans

Meistgelesene Fragen zum Thema Netbeans