-
Notifications
You must be signed in to change notification settings - Fork 0
/
iterators.tex
88 lines (73 loc) · 2.35 KB
/
iterators.tex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
\section{Iteratoren}
\begin{frame}[fragile]
\frametitle{Iteratoren : fail-fast}
\begin{lstlisting}
void failFastIterator() {
List<String> l = new ArrayList<>();
l.add("a");
for (String s : l) { // ConcurrentModificationException beim zweiten Aufruf
l.add(s);
}
}
\end{lstlisting}
\begin{block}{Was ist fail-fast ?}
\begin{itemize}[<+->]
\item Iterator wird erstellt
\item zugrunde liegende Collection wird modifiziert (ausgenommen Iterator.remove())
\item Iterator wirft beim nächsten Aufruf ConcurrentModificationException
\item[$\Rightarrow$] schneller Fehler im Fall einer concurrent modification
\end{itemize}
\end{block}
\end{frame}
\begin{frame}
\frametitle{Iteratoren : fail-fast}
\begin{block}{Achtung}
\begin{itemize}[<+->]
\item wird über ein internes status feld realisiert, bspw ArrayList mit int modCount
\item fail-fast ist nicht garantiert
\item Heuristik entscheidet: Es kann auch keine ConcurrentModificationException fliegen, trotz Modifikation!
\item Nicht auf ConcurrentModificationException im normalen Programmfluss reagieren, das ist nur eine Bug-Erkennung!
\end{itemize}
\end{block}
\end{frame}
\begin{frame}[fragile]
\frametitle{Iteratoren : fail-safe}
klappt: gibt [a,a] aus
\begin{lstlisting}
void failSafeIterator() {
List<String> l = new CopyOnWriteArrayList<>();
l.add("a");
for (String s : l) {
l.add(s);
}
System.out.println(l);
}
\end{lstlisting}
\begin{block}{Was ist fail-safe ?}
\begin{itemize}
\item keine Exception (ConcurrentModificationException)
\item Iteratoren arbeiten auf einer Kopie
\item Kopie muss nicht aktuell sein
\end{itemize}
\end{block}
\end{frame}
\begin{frame}[fragile]
\frametitle{Iteratoren : weakly-consistent}
funktioniert, Ausgabe [a, aa]
\begin{lstlisting}
void weaklyConsistentIterator() {
ConcurrentSkipListSet<String> set = new ConcurrentSkipListSet<>();
set.add("a");
for (String s : set) {
set.add(s + s);
}
System.out.println(set);
}
\end{lstlisting}
\begin{block}{Was ist weakly-consistent ?}
\begin{itemize}
\item keine Exception (ConcurrentModificationException)
\item während Iteration: zeigen vielleicht Änderungen an, vielleicht auch nicht
\end{itemize}
\end{block}
\end{frame}