\begin{slide}{Locks}

jedes Java-Objekt kann als \emph{lock} (Monitor, Sperre) dienen

\verb|synchronized|-Blöcke: Betreten bei Lock-Besitz,
Verlassen mit Lock-Rückgabe,

für jeden Lock: zu jedem Zeitpunkt kann ihn höchstens ein Thread besitzen

\begin{verbatim}
Object lock = ...
synchronized (lock) { ... } // Anweisung

synchronized void m () { ... } // Methode
==> void m () { synchronized (this) { ... } }
\end{verbatim}

Locks sind \emph{re-entrant}, damit aus einer synchronisierten Methode
eine andere aufgerufen werden kann (mit dem Lock, den der Thread
schon besitzt)
  
\end{slide}

\begin{slide}{Granularität der Locks}

  \begin{itemize}
    \item jede Zustandsvariable sollte durch genau einen 
      Lock bewacht werden (im Quelltext dokumentieren!)
\item 
  Synchronisation einzelner Variablenzugriffe ist oft zu wenig
  \item 
Synchronisation einer gesamten Methode ist oft zu teuer
(verhindert mögliche Nebenläufigkeit)
  \end{itemize}

Für jede Klassen-Invariante:
alle Variablen, die in der Invariante benutzt werden,
müssen durch einen gemeinsamen Lock geschützt werden.

\end{slide}
