Parallele Programmierung: volatile Variable nimmt ungewöhnlichen Wert an

Mujahiddin

Top Contributor
Hallo Spezialisten!

Folgendes Programm ist gegeben:

Java:
import java.util.Arrays;
import java.util.concurrent.CyclicBarrier;


public class RandomNumGen {
	
	int d0, d1, d3;
	volatile int dv2, dv4, dv5;
	final CyclicBarrier barrier = new CyclicBarrier( 2 );
	final int[] digits = new int[6];
	
	public class Thread1 extends Thread {
		
		@Override
		public void run() {
			try {
				
				barrier.await();
				
				d0++;
				d1++;
				
				dv2++;
				
				d3 = 9;
				
				barrier.await();
				
				for( int i = 0; i < 4; i++ ) {
					dv4++;
				}
				
				barrier.await();
				
				barrier.await();
				dv5 = 7;
			} catch( Exception e ) {}
		} // END OF run
	} // END OF Thread1
	
	public class Thread2 extends Thread {
		
		@Override
		public void run() {
			try {
				
				barrier.await();
				digits[ 1 ] = d1;
				digits[ 0 ] = d0;
				
				digits[ 2 ] = dv2;
				
				barrier.await();
				digits[ 3 ] = d3;
				
				for( int i = 0; i < 4; i++ ) {
					dv4++;
				}
				
				barrier.await();
				digits[ 4 ] = dv4;
				
				barrier.await();
				dv5 = 5;
			} catch( Exception e ) {}
		} // END OF run
	} // END OF Thread2
	
	public int[] getDigits() {
		d0 = 0;
		d1 = 0;
		d3 = 0;
		dv2 = 0;
		dv4 = 0;
		dv5 = 0;
		Thread t1 = new Thread1();
		Thread t2 = new Thread2();
		t1.start();
		t2.start();
		try {
			t1.join();
			t2.join();
			digits[ 5 ] = dv5;
		} catch( Exception e ) {}
		return digits;
	}
} // END OF RandomNumGen

Die Aufgabe besteht nun darin, dieses Programm zu analysieren und bei dem Array
Code:
getDigits()
, das auf 6 Feldern (0 - 5) besteht, die verschiedenen Möglichkeiten finden und begründen.

Zwei Fragen, die ich mir stelle (in der Vorlesung wurde dazu was gesagt, aber ich kann dem Dozent nicht blindlings vertrauen...):

1. Können die Werte
Code:
digits[0]
und
Code:
digits[1]
4 unterschiedliche Kombinationen an Werten von 0 und 1 annehmen?
Wenn man diesen Code ohne mehr oder weniger "tiefgründiges" Wissen liest, müsste man ja sagen, dass es 3 Möglichkeiten gibt: 0|0, 1|0, 1|1 (ist ja hoffentlich klar)
Ist aber auch 0|1 möglich? In der Vorlesung wurde gesagt, dass es dem Compiler (oder der JVM) überlassen ist, ob
Code:
d0++;
vor
Code:
d1++;
ausgeführt wird, er könne diese auch einfach umtauschen, da die Instruktionen nicht voneinander abhängen. Stimmt das? Wenn ja, liegt es am Compiler oder an der JVM? (Ich habe in meiner Zeit hier im Forum auch öfter mal den Begriff HotSpot gehört, wenn es um solche/ähnliche Sachen ging)

2. digits[4] (hier der Code, der dies betrifft):
Thread1:
Java:
for( int i = 0; i < 4; i++ )
	dv4++; //volatile int dv4;
Thread2:
Java:
for( int i = 0; i < 4; i++ )
	dv4++;
barrier.await();
digits[ 4 ] = dv4;

Ich habe hierzu schon Gedanken gemacht:
Für digits[4] können alle Werte von 2 bis 8 stehen.
Wenn man das an einem Extrembeispiel festmacht, wird es vielleicht klar, und wenn ich irgendwo falsch liege, könnt ihr mich ja verbessern:

Code:
Thread1 zieht den Wert dv4, welcher 0 ist, in seinen Stack [will Addition ausführen, wird aber genau hier unterbrochen]

Thread2 zieht den Wort dv4, welcher 0 ist, in seinen Stack.
	Er addiert eins drauf und legt 1 in dv4 rein.
	Er liest dv4 (1) aus.
	Er schreibt 2 in dv4 rein.
	Er liest dv4 (2) aus.
	Er schreibt 3 in dv4 rein.

Thread1 schreibt 1 in dv4 rein.

Thread2 liest dv4 (1) aus.

Thread1 liest dv4 (1) aus.
	Er schreibt 2 in dv4 rein.
	Er liest dv4 (2) aus.
	Er schreibt 3 in dv4 rein.
	Er liest dv4 (3) aus.
	Er schreibt 4 in dv4 rein
	Er stößt auf den Barrier und wartet...

Thread2 schreibt 2 in dv4 rein und wartet am Barrier.

Thread2 schreibt dv4 (2) in digits[ 4 ].

Das wäre jetzt das Extrembeispiel für 2 in digits[ 4 ]...
Ich hoffe, ich habe das mit Stack und Heap richtig verstanden (danke Ark :))

Also die zweite Frage ist, ob ich damit richtig liege! Könnte auch 1 möglich sein oder liege ich gar völlig falsch? Eclipse hat mir einmal 3 ausgegeben für digits[4].

Liebe Grüße und danke im Voraus,

Mujahiddin.

[EDIT]Ich sehe gerade, der Threadtitel ist ziemlich irreführend... Den hatte ich anfangs drinstehen und während ich schrieb, fiel mir ein, warum diese "ungewöhnlichen" Werte (in diesem Fall 3 für digits[4]) angenommen wurden... Vergaß, den Titel zu ändern![/EDIT]
 
Zuletzt bearbeitet:

Pentalon

Bekanntes Mitglied
>>>Wenn man diesen Code ohne mehr oder weniger "tiefgründiges" Wissen liest, müsste man ja sagen, dass es 3 Möglichkeiten gibt: 0|0, 1|0, 1|1 (ist ja hoffentlich klar)

Es sind 4 Möglichkeiten:
0|0, 0|1, 1|0, 1|1

Pentalon
 

Mujahiddin

Top Contributor
>>>Wenn man diesen Code ohne mehr oder weniger "tiefgründiges" Wissen liest, müsste man ja sagen, dass es 3 Möglichkeiten gibt: 0|0, 1|0, 1|1 (ist ja hoffentlich klar)

Es sind 4 Möglichkeiten:
0|0, 0|1, 1|0, 1|1

Pentalon

Das ist gerade die Frage... Warum ist 0|1 (wenn überhaupt) möglich? Liegt das am JVM oder am Compiler, also stimmt, was der Dozent meinte?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Open Soure Projekte für parallele Programmierung Allgemeine Java-Themen 6
6 Java - Threads - parallele Programmierung - Tutorial Allgemeine Java-Themen 6
I parallele Programmierung mit Java Allgemeine Java-Themen 3
M Wie funktionieren parallele Java Streams? Allgemeine Java-Themen 1
S Threads Kann mir jemand helfen eine parallele Hilfsklasse zu implementieren..? Allgemeine Java-Themen 3
M Parallele Konzepte in Java Allgemeine Java-Themen 4
B parallele / Multithreaded Iteration über Map Allgemeine Java-Themen 12
P Java 3D parallele Ebenen Allgemeine Java-Themen 4
S Programm für parallele bearbeitung Allgemeine Java-Themen 11
V Parallele Ausführung Allgemeine Java-Themen 8
A Parallele Threads oder verschachtelte? Allgemeine Java-Themen 7
T parallele Schnittstelle auslesen Allgemeine Java-Themen 5
H javax.comm und Parallele Schnittstelle (PIN für PIN) Allgemeine Java-Themen 7
H Zugriff auf parallele Schnittstelle Allgemeine Java-Themen 4
H Java Rechner Programmierung der Mathematik Allgemeine Java-Themen 33
districon Rekursion und Dynamische Programmierung Allgemeine Java-Themen 2
D Vigenere Chiffre Programmierung Allgemeine Java-Themen 5
G Thread-Programmierung Allgemeine Java-Themen 5
R Input/Output Programmierung mithilfe der Robot Bibliothek Allgemeine Java-Themen 15
MiMa Programmierung von Bibliotheksklassen Allgemeine Java-Themen 3
zhermann Grundsatzfrage zur strukturierter Programmierung Allgemeine Java-Themen 5
S Kaffemaschine Programmierung Probleme Allgemeine Java-Themen 2
P jCheckBox auf der zusammengeknüpften Programmierung anzeigen lassen Allgemeine Java-Themen 3
K Test-Frist Programmierung - wie vorgehen Allgemeine Java-Themen 5
C Programmierung von Fotoeffekten mit Java möglich? Allgemeine Java-Themen 3
J Rekursive Programmierung-Zählen von Ziffern Allgemeine Java-Themen 5
L Designfrage: Dispatcher-Programmierung - redundante Auslegung Allgemeine Java-Themen 1
E Sonderzeichen nicht setzbar: Großes Problem bei Programmierung unter Linux Mint mit Virtual Box Allgemeine Java-Themen 5
C BlackBox-Framework - Plugin Programmierung Allgemeine Java-Themen 4
S Objekt orientierte Programmierung Allgemeine Java-Themen 7
E Socket Client-Server-Programmierung Allgemeine Java-Themen 44
E Thread Programmierung Allgemeine Java-Themen 2
K Multithread Programmierung...ExecutionCompletionService Allgemeine Java-Themen 7
E objektorientierte Programmierung Allgemeine Java-Themen 3
C Hilfe bei Adressbuch-Programmierung, wie am Besten mit JList implementieren Allgemeine Java-Themen 2
J Problem mit der Thread Programmierung Allgemeine Java-Themen 2
T Fehler bei der Programmierung eines Universaldienstbrowsers Allgemeine Java-Themen 3
J 3d-Programmierung Allgemeine Java-Themen 7
S BlueJ BlueJ - Geldautomat-Programmierung Allgemeine Java-Themen 2
G Funktionale Programmierung, OO- Programmierung, ... Allgemeine Java-Themen 9
J Hardware Programmierung Allgemeine Java-Themen 3
Kr0e Atomic / Lockfree Programmierung Allgemeine Java-Themen 11
X Error bei der Programmierung eines Sortieralgorithmus Allgemeine Java-Themen 2
J Modul/Komponenten/Addon-Programmierung Allgemeine Java-Themen 3
ModellbahnerTT Dynamische Programmierung, komme nicht weiter.... Allgemeine Java-Themen 15
S Applet Programmierung in Eclipse Allgemeine Java-Themen 12
B Observer vs Listener (GUI-Programmierung) Allgemeine Java-Themen 5
Developer_X Batch Programmierung Allgemeine Java-Themen 4
Developer_X Datei Programmierung Allgemeine Java-Themen 18
hdi Suche nach Begriff aus der Programmierung Allgemeine Java-Themen 11
K Programmierung einer Hilfe Allgemeine Java-Themen 6
G Threads programmierung Allgemeine Java-Themen 7
F Frage zu JSP / Java Programmierung Allgemeine Java-Themen 2
L Brauche Hilfe bei Memory Programmierung Allgemeine Java-Themen 2
G Framework für Multi-Prozessor-Programmierung? Allgemeine Java-Themen 4
tomtailor Mobiltelefon - Programmierung Allgemeine Java-Themen 8
O Oberfläche und "richtige" Programmierung Allgemeine Java-Themen 8
ven000m Constraint Programmierung Allgemeine Java-Themen 6
X Langsames Java im Bereich der GUI-Programmierung Allgemeine Java-Themen 8
F Klausuraufgaben Java-Programmierung Allgemeine Java-Themen 10
D Elegante Programmierung. Allgemeine Java-Themen 7
G Software für Java programmierung Allgemeine Java-Themen 5
J Frage zu Objektorientierter Programmierung Allgemeine Java-Themen 9
K Bubblesort Programmierung, finde Fehler nicht . Allgemeine Java-Themen 25
bernd Hardwarenahe Programmierung Allgemeine Java-Themen 14
S Taschenrechner und Programmierung Allgemeine Java-Themen 4
D Fraen zur Programmierung einer Volltextsuche Allgemeine Java-Themen 8
J Collections, Locks und volatile ? Allgemeine Java-Themen 1
P volatile bei threadsafe Klassen nötig? Allgemeine Java-Themen 3
hdi synchronized & volatile Allgemeine Java-Themen 10
E Multithreading and volatile Allgemeine Java-Themen 10
hdi volatile & Thread#sleep/yield - Versteh ich nich Allgemeine Java-Themen 14
B Volatile Frage: Reicht es nur den Singleton als volatile zu deklarieren? Allgemeine Java-Themen 4
J volatile Verständnisfrage Allgemeine Java-Themen 6

Ähnliche Java Themen

Neue Themen


Oben