CSE 332 Data Abstractions: Data Races and Memory, Reordering, Deadlock, Readers/Writer Locks, and Condition Variables (oh my!) Kate Deibel Summer 2012
August 6, 2012 CSE 332 Data Abstractions, Summer 2012 1
Summer 2012 August 6, 2012 CSE 332 Data Abstractions, Summer 2012 - - PowerPoint PPT Presentation
CSE 332 Data Abstractions: Data Races and Memory, Reordering, Deadlock, Readers/Writer Locks, and Condition Variables (oh my!) Kate Deibel Summer 2012 August 6, 2012 CSE 332 Data Abstractions, Summer 2012 1 *ominous music* THE FINAL EXAM
August 6, 2012 CSE 332 Data Abstractions, Summer 2012 1
August 6, 2012 CSE 332 Data Abstractions, Summer 2012 2
July 11, 2012 CSE 332 Data Abstractions, Summer 2012 3
July 11, 2012 CSE 332 Data Abstractions, Summer 2012 4
July 11, 2012 CSE 332 Data Abstractions, Summer 2012 5
Some horses like wet tracks or dry tracks or muddy tracks…
August 6, 2012 CSE 332 Data Abstractions, Summer 2012 6
August 6, 2012 CSE 332 Data Abstractions, Summer 2012 7
August 6, 2012 CSE 332 Data Abstractions, Summer 2012 8
August 6, 2012 CSE 332 Data Abstractions, Summer 2012 9
class Stack<E> { … synchronized boolean isEmpty() {…} synchronized void push(E val) {…} synchronized E pop(E val) {…} E peek() { E ans = pop(); push(ans); return ans; }
August 6, 2012 CSE 332 Data Abstractions, Summer 2012 10
August 6, 2012 CSE 332 Data Abstractions, Summer 2012 11
August 6, 2012 CSE 332 Data Abstractions, Summer 2012 12
August 6, 2012 CSE 332 Data Abstractions, Summer 2012 13
August 6, 2012 CSE 332 Data Abstractions, Summer 2012 14
August 6, 2012 CSE 332 Data Abstractions, Summer 2012 15
August 6, 2012 CSE 332 Data Abstractions, Summer 2012 16
August 6, 2012 CSE 332 Data Abstractions, Summer 2012 17
August 6, 2012 CSE 332 Data Abstractions, Summer 2012 18
August 6, 2012 CSE 332 Data Abstractions, Summer 2012 19
August 6, 2012 CSE 332 Data Abstractions, Summer 2012 20
August 6, 2012 CSE 332 Data Abstractions, Summer 2012 21
August 6, 2012 CSE 332 Data Abstractions, Summer 2012 22
all memory needs synchronization
August 6, 2012 CSE 332 Data Abstractions, Summer 2012 23
immutable memory thread-local memory
August 6, 2012 CSE 332 Data Abstractions, Summer 2012 24
August 6, 2012 CSE 332 Data Abstractions, Summer 2012 25
August 6, 2012 CSE 332 Data Abstractions, Summer 2012 26
August 6, 2012 CSE 332 Data Abstractions, Summer 2012 27
August 6, 2012 CSE 332 Data Abstractions, Summer 2012 28
August 6, 2012 CSE 332 Data Abstractions, Summer 2012 29
August 6, 2012 CSE 332 Data Abstractions, Summer 2012 30
August 6, 2012 CSE 332 Data Abstractions, Summer 2012 31
August 6, 2012 CSE 332 Data Abstractions, Summer 2012 32
August 6, 2012 CSE 332 Data Abstractions, Summer 2012 33
August 6, 2012 CSE 332 Data Abstractions, Summer 2012 34
August 6, 2012 CSE 332 Data Abstractions, Summer 2012 35
August 6, 2012 CSE 332 Data Abstractions, Summer 2012 36
August 6, 2012 CSE 332 Data Abstractions, Summer 2012 37
August 6, 2012 CSE 332 Data Abstractions, Summer 2012 38
August 6, 2012 CSE 332 Data Abstractions, Summer 2012 39
August 6, 2012 CSE 332 Data Abstractions, Summer 2012 40
August 6, 2012 CSE 332 Data Abstractions, Summer 2012 41
August 6, 2012 CSE 332 Data Abstractions, Summer 2012 42
August 6, 2012 CSE 332 Data Abstractions, Summer 2012 43
August 6, 2012 CSE 332 Data Abstractions, Summer 2012 44
x = 1; y = 1; int a = y; int b = x; assert(b >= a);
August 6, 2012 CSE 332 Data Abstractions, Summer 2012 45
August 6, 2012 CSE 332 Data Abstractions, Summer 2012 46
August 6, 2012 CSE 332 Data Abstractions, Summer 2012 47
class C { private volatile int x = 0; private volatile int y = 0; void f() { x = 1; y = 1; } void g() { int a = y; int b = x; assert(b >= a); } }
August 6, 2012 CSE 332 Data Abstractions, Summer 2012 48
August 6, 2012 CSE 332 Data Abstractions, Summer 2012 49
August 6, 2012 CSE 332 Data Abstractions, Summer 2012 50
class BankAccount { … synchronized void withdraw(int amt) {…} synchronized void deposit(int amt) {…} synchronized void transferTo(int amt, BankAccount a) { this.withdraw(amt); a.deposit(amt); } }
August 6, 2012 CSE 332 Data Abstractions, Summer 2012 51
August 6, 2012 CSE 332 Data Abstractions, Summer 2012 52
August 6, 2012 CSE 332 Data Abstractions, Summer 2012 53
August 6, 2012 CSE 332 Data Abstractions, Summer 2012 54
August 6, 2012 CSE 332 Data Abstractions, Summer 2012 55
August 6, 2012 CSE 332 Data Abstractions, Summer 2012 56
August 6, 2012 CSE 332 Data Abstractions, Summer 2012 57
August 6, 2012 CSE 332 Data Abstractions, Summer 2012 58
August 6, 2012 CSE 332 Data Abstractions, Summer 2012 59
make a new lock, initially “not held”
writing”, else make “held for writing”
block if currently “held for writing”, else make/keep “held for reading” and increment readers count
decrement readers count, if 0, make “not held” ADT Invariants: 0 writers 1 0 readers writers ╳ readers==0
java.util.concurrent.locks.ReentrantReadWriteLock
August 6, 2012 CSE 332 Data Abstractions, Summer 2012 66
f e d c
buffer back front producer(s) enqueue consumer(s) dequeue
if(isFull()) this.wait(); add to array
Time Thread 2 (dequeue) Thread 1 (enqueue)
take from array if(was full) this.notify(); make full again
Thread 3 (enqueue)
Time
while(isFull()) this.wait(); …
Thread 1 (enqueue)
// dequeue #1 if(buffer was full) this.notify(); // dequeue #2 if(buffer was full) this.notify();
Thread 3 (dequeues) Thread 2 (enqueue)
while(isFull()) this.wait(); …
synchronized void enqueue(E elt) { … if(buffer was empty) this.notifyAll(); // wake everybody up } synchronized E dequeue() { … if(buffer was full) this.notifyAll(); // wake everybody up }