Twitter und Facebook-Anbindung
X
Tweet Follow @twitterapi
!!! Anbindung an twitter und facebook öffnen !!!

Wenn Ihnen mein Online-Buch gefällt,
dann bedanken Sie sich doch mit einer kleinen Spende...

29 Volatile

29 Volatile

Immer dann, wenn man mit mehreren Threads arbeitet, kann es zu s.g. konkurrierenden Zugriffen kommen. Damit meine ich, das sie sich darum "streiten", wer eine Ressource nutzen darf. Natürlich streiten sie sich nicht, aber es ist aus der Sicht des Programmierers nicht vorher zusagen, wer wann welchen Zugriff macht. Wir haben z.B. vorhin gesehen, dass die Ausgaben der Threads auf der Konsole gemischt waren. Wir wollten das vorhin auch, aber wenn 2 Threads jetzt etwas ausdrucken sollen, wäre es sehr unangenehm, wenn wir quasi 2 Bilder erhalten würden, welche in einem groß verschmelzen. Ein anderer kritischer Fall ist, wenn 2 oder mehr Threads jetzt auf eine Liste zugreifen wollen. Dort müssen wir Maßnahmen ergreifen um zu verhindern, dass sie nicht alle an die selbe stelle etwas schreiben oder versuchen den gleichen Speicher freizugeben. Genauso unvorhersehbar ist es, wenn ein Thread etwas in Variable A schreibt und ein anderer daraus ließt. In diesem Szenario kann man unmöglich vorhersagen, was tatsächlich gelesen wird, da ja überspitzt ausgedrückt, die Hälfte des neuen Wertes schon drin stehen kann und in der anderen Hälfte noch der alte Wert steht. Stand vorher eine 4 drin und es wird jetzt eine 1 geschrieben, kann es durchaus vorkommen, dass eine 5 gelesen wird.

 1
					
volatile int iProtectedValue = 5;
					

Um dieses Problem zu umgehen, ist es möglich eine Variablen vor mehrfachen Zugriff zu schützen. Dafür gibt es ein spezielles Schlüsselwort namens "volatile", welches man vor den Variablentyp schreibt. Allerdings hat diese Sache einen großen Haken. Dieser Mechanismus funktioniert nur richtig bei Primitivtypen. Möchte man eine Struktur oder Klasse schützen, reicht es nicht, das Schlüsselwort vor den Klassennamen der Objektdeklaration zu schreiben, sondern man muss es schon für jedes Attribut (in der Klassendeklaration) schreiben. Noch kritischer wird es bei Zeigern. Ein "volatile" würde sich dann nicht auf den Bereich beziehen, auf welchen der Zeiger verweist, sondern auf den Zeiger selbst. Man könnte ihn also nicht gleichzeitig umbiegen, aber dennoch auf deren Member ungeschützt zugreifen.

Unterm Strich gesehen bringt einem dieser Mechanismus also eher selten etwas, zumal man weniger Variablen schützen muss, als ganze Quelltextabschnitte. Aus diesem Grund spare ich mir jetzt lange Implementierungen. Interessanter ist dann schon das nächste Kapitel.

Zum Seitenanfang
Zum Inhaltsverzeichnis

© Copyright by Thomas Weiß, 2009 - 2012