Umgang mit Thread/ Synchronisation/ Deadlock-Vermeidung

masul

Mitglied
Hallo zusammen!

Ich schreibe morgen eine Klausur und habe in einer Altklausur eine Aufgabe zum Thema Threads gefunden, die mir noch Kopfzerbrechen bereitet. Jetzt habe ich schon einiges über Threads gelesen, das allgemeine Prinzip habe ich schon verstanden, aber mir ist die Umsetzung bzw. die Vorgehensweise vom Multithreading als Java Code noch nicht so ganz klar. Vielleicht könnt ihr mir ja dabei helfen, denn auf Anhieb wüsste ich jetzt nicht, wie ich an diese Aufgabe herangehen würde..
Ich bin für jede Hilfe dankbar!!!
 

Anhänge

  • threads.jpg
    threads.jpg
    87,4 KB · Aufrufe: 68
Hallo masul,

du könntest die Bereiche von data1 und data2 in ein synchronized setzen. Damit blockst du nicht die ganze Methode, sondern nur die Stellen an dem die Daten aus dem Array gelesen werden.

Just my 2 cents

Gruß
 
Du musst natürlich sicherstellen das zu dem Zeitpunkt wo gerade aus dem Array gelesen wird nichts überschrieben wird und anders rum.

Ggf. musst du noch der Klasse Lock (java.util.concurrent.locks.Lock) arbeiten. Das Interface gibt dir die Möglichkeit über lock() und unlock() zu arbeiten.
 
Mein Ansatz:
Java:
public class DataCenter {
	private Disk[] diskArray;
	
	public Data restore(int disk1, int disk2, long key) {
		int min, max;
		if (disk1 < disk2) {
			min = disk1;
			max = disk2;
		} else {
			min = disk2;
			max = disk1;
		}
		Disk diskMin = diskArray[min];
		Disk diskMax = diskArray[max];
		Data data1, data2;
		synchronized (diskMin) {
			data1 = diskMin.read(key);
			synchronized (diskMax) {
				data2 = diskMax.read(key);
			}
		}
		if (data1.compareTo(data2) == 0) {
			return data1;
		} else {
			return null;
		}
	}
	
	public Data restore(int disk1, int disk2, Data data, long key) {
		int min, max;
		if (disk1 < disk2) {
			min = disk1;
			max = disk2;
		} else {
			min = disk2;
			max = disk1;
		}
		Disk diskMin = diskArray[min];
		Disk diskMax = diskArray[max];
		Data data1, data2;
		synchronized (diskMin) {
			diskMin.write(data, key);
			synchronized (diskMax) {
				diskMax.write(data, key);
			}
		}
	}
}

interface Data extends Comparable {}

interface Disk {
	public Data read(long key);
	public void write(Data data, long key);
}
Man muss auf beiden Disks synchronisieren. Um sich keinen Deadlock einzufangen, muss man auf eine totale Ordnung achten, die man beim Locken mehrerer Disks befolgt. Ich erreiche dies dadurch, dass ich erst die Disk mit dem kleineren Index locke, dann die mit dem größeren.
du könntest die Bereiche von data1 und data2 in ein synchronized setzen.
Am ganzen DataCenter bzw. diskArray? Damit würden sich doch sämtliche Threads ausbremsen, die eigentlich nichts miteinander zu tun hätten.
 

Neue Themen


Zurück
Oben