%Teilweise Erzeugt mit dem LaTeX-Generator: http://latex.sehnot.de

%Schriftgröße, Layout, Papierformat, Art des Dokumentes
\documentclass[10pt,oneside,a4paper]{scrartcl}

%Einstellungen der Seitenränder
\usepackage[left=2cm,right=2cm,top=1.5cm,bottom=1.5cm,includeheadfoot]{geometry}

%neue Rechtschreibung
\usepackage[ngerman]{babel}

%Umlaute ermöglichen
\usepackage[utf8]{inputenc}

%Gesamtseitenzahl
\usepackage{lastpage}

% Kopf- und Fußzeile
\usepackage[automark]{scrpage2}

%Quellcode-Listings
\usepackage{listings}

%Hyperlinks
\usepackage{hyperref}

%Kopfzeile
\ihead{Java}
\chead{}
\ohead{http://kohnlehome.de/java/visibility-race-conditions.pdf}
\setheadsepline{0.5pt}

%Fußzeile
\setfootsepline{0.5pt}
\ifoot{Franz Kohnle}
\cfoot{Seite \thepage\ von  \pageref{LastPage}}
\ofoot{\today}

\pagestyle{scrheadings}

\begin{document}

% Überschrift 
\begin{center}
\LARGE % Schriftgröße
\bfseries % Fettdruck
\sffamily % Serifenlose Schrift
Java: Visibility + Race Conditions
\end{center}

\section{Java Speichermodell}
\subsection*{Ein eigener Stack für jeden Thread}
\begin{itemize}
\item lokale Variablen
\item Methodenparameter
\item Rückgabewerte
\item Verwaltungsaufrufe für Methodenaufrufe
\end{itemize}

\subsection*{Ein gemeinsamer Heap für alle Threads}
\begin{itemize}
\item Objekte
\item Membervariablen
\item Klassenvariablen (static)
\end{itemize}

\section{Hardware Speicherarchitektur}
{\linespread{0.3}\begin{verbatim}
+----------+   +----------+
|   CPU    |   |   CPU    | 
|    |     |   |    |     |
| Register |   | Register |
+----------+   +----------+
     |              |
+----------+   +----------+
|  Cache   |   |  Cache   |
+----------+   +----------+
     |              |
+-------------------------+
|     gemeinsamer RAM     |
+-------------------------+
\end{verbatim}{\linespread{1}

\section{Probleme beim Zugriff mehrerer Threads auf gemeinsame Daten}
\subsection*{Sichtbarkeit}
Wenn ein Thread den Wert einer \textbf{gemeinsamen Variablen} verändert, kann es sein, dass ein anderer Thread die Änderung des Wertes \textbf{nicht sieht}, weil die Änderung nur im Cache stattgefunden hat.

\subsubsection*{Lösung}
Variable als \textbf{volatile} deklarieren:

Der Lese- und Schreibzugriff findet immer direkt auf dem RAM statt.

$\Rightarrow$ \textbf{visibility} ist gewährleistet, aber nicht \textbf{atomicity}

\subsection*{Race Conditions}
Mehrere Threads führen \textbf{den selben Quellcode} aus und greifen \textbf{schreibend} auf \textbf{gemeinsame Variablen} zu.
Je nachdem, in welcher Reihenfolge die Einzelbefehle der Threads ausgeführt werden, kann nach Ausführung des Codes der Wert der Variablen unterschiedlich sein.

\subsubsection*{Lösung}
Codeabschnitt als \textbf{synchronized} markieren:

Der Codeabschnitt wird immer nur von einem Thread gleichzeitig ausgeführt.


$\Rightarrow$ \textbf{visibility} und \textbf{atomicity} sind gewährleistet.

{\linespread{1}

\end{document}
