programming paradigms for concurrency · this lecture • introduce four “patterns” –bag of...

283
Programming Paradigms for Concurrency Lecture 6 – Synchronization of Concurrent Objects Based on companion slides for The Art of Multiprocessor Programming by Maurice Herlihy & Nir Shavit Modified by Thomas Wies New York University

Upload: others

Post on 23-Jul-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

Programming Paradigms for Concurrency Lecture 6 – Synchronization of Concurrent Objects

Based on companion slides for The Art of Multiprocessor Programming

by Maurice Herlihy & Nir Shavit

Modified by Thomas Wies

New York University

TexPoint fonts used in EMF. Read the TexPoint manual before you delete this box.: AAAA

Page 2: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

2

Last Two Lectures:

Synchronization Primitives

CS

Resets lock upon exit

spin lock

critical section

. . .

Page 3: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

3

Today: Concurrent Objects

• Adding threads should not lower

throughput

– Contention effects

– Mostly fixed by Queue locks

Page 4: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

4

Today: Concurrent Objects

• Adding threads should not lower

throughput

– Contention effects

– Mostly fixed by Queue locks

• Should increase throughput

– Not possible if inherently sequential

– Surprising things are parallelizable

Page 5: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

5

Coarse-Grained Synchronization

• Each method locks the object

– Avoid contention using queue locks

Page 6: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

6

Coarse-Grained Synchronization

• Each method locks the object

– Avoid contention using queue locks

– Easy to reason about

• In simple cases

Page 7: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

7

Coarse-Grained Synchronization

• Each method locks the object

– Avoid contention using queue locks

– Easy to reason about

• In simple cases

• So, are we done?

Page 8: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

8

Coarse-Grained Synchronization

• Sequential bottleneck

– Threads “stand in line”

Page 9: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

9

Coarse-Grained Synchronization

• Sequential bottleneck

– Threads “stand in line”

• Adding more threads

– Does not improve throughput

– Struggle to keep it from getting worse

Page 10: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

10

Coarse-Grained Synchronization

• Sequential bottleneck

– Threads “stand in line”

• Adding more threads

– Does not improve throughput

– Struggle to keep it from getting worse

• So why even use a multiprocessor?

– Well, some apps inherently parallel …

Page 11: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

11

This Lecture

• Introduce four “patterns”

– Bag of tricks …

– Methods that work more than once …

Page 12: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

12

This Lecture

• Introduce four “patterns”

– Bag of tricks …

– Methods that work more than once …

• For highly-concurrent objects

– Concurrent access

– More threads, more throughput

Page 13: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

13

First:

Fine-Grained Synchronization

• Instead of using a single lock …

• Split object into

– Independently-synchronized components

• Methods conflict when they access

– The same component …

– At the same time

Page 14: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

14

Second:

Optimistic Synchronization

• Search without locking …

Page 15: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

15

Second:

Optimistic Synchronization

• Search without locking …

• If you find it, lock and check …

– OK: we are done

– Oops: start over

Page 16: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

16

Second:

Optimistic Synchronization

• Search without locking …

• If you find it, lock and check …

– OK: we are done

– Oops: start over

• Evaluation

– Usually cheaper than locking, but

– Mistakes are expensive

Page 17: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

17

Third:

Lazy Synchronization

• Postpone hard work

• Removing components is tricky

– Logical removal

• Mark component to be deleted

– Physical removal

• Do what needs to be done

Page 18: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

18

Fourth:

Lock-Free Synchronization

• Don’t use locks at all

– Use compareAndSet() & relatives …

Page 19: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

19

Fourth:

Lock-Free Synchronization

• Don’t use locks at all

– Use compareAndSet() & relatives …

• Advantages

– No Scheduler Assumptions/Support

Page 20: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

20

Fourth:

Lock-Free Synchronization

• Don’t use locks at all

– Use compareAndSet() & relatives …

• Advantages

– No Scheduler Assumptions/Support

• Disadvantages

– Complex

– Sometimes high overhead

Page 21: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

21

Linked List

• Illustrate these patterns …

• Using a list-based Set

– Common application

– Building block for other apps

Page 22: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

22

Set Interface

• Unordered collection of items

Page 23: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

23

Set Interface

• Unordered collection of items

• No duplicates

Page 24: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

24

Set Interface

• Unordered collection of items

• No duplicates

• Methods

– add(x) put x in set

– remove(x) take x out of set

– contains(x) tests if x in set

Page 25: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

25

List-Based Sets

public interface Set<T> {

public boolean add(T x);

public boolean remove(T x);

public boolean contains(T x);

}

Page 26: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

26

List-Based Sets

public interface Set<T> {

public boolean add(T x);

public boolean remove(T x);

public boolean contains(T x);

}

Add item to set

Page 27: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

27

List-Based Sets

public interface Set<T> {

public boolean add(T x);

public boolean remove(T x);

public boolean contains(Tt x);

}

Remove item from set

Page 28: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

28

List-Based Sets

public interface Set<T> {

public boolean add(T x);

public boolean remove(T x);

public boolean contains(T x);

}

Is item in set?

Page 29: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

29

List Node

public class Node {

public T item;

public int key;

public Node next;

}

Page 30: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

30

List Node

public class Node {

public T item;

public int key;

public Node next;

}

item of interest

Page 31: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

31

List Node

public class Node {

public T item;

public int key;

public Node next;

}

Usually hash code

Page 32: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

32

List Node

public class Node {

public T item;

public int key;

public Node next;

}

Reference to next node

Page 33: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

33

The List-Based Set

a b c

Sorted with Sentinel nodes

(min & max possible keys)

-∞

+∞

Page 34: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

34

Reasoning about Concurrent

Objects

• Invariant

– Property that always holds

Page 35: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

35

Reasoning about Concurrent

Objects

• Invariant

– Property that always holds

• Established because

– True when object is created

– Truth preserved by each method

• Each step of each method

Page 36: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

36

Specifically …

• Invariants preserved by

– add()

– remove()

– contains()

Page 37: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

37

Specifically …

• Invariants preserved by

– add()

– remove()

– contains()

• Most steps are trivial

– Usually one step tricky

– Often linearization point

Page 38: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

38

Interference

• Invariants make sense only if

– methods considered

– are the only modifiers

Page 39: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

39

Interference

• Invariants make sense only if

– methods considered

– are the only modifiers

• Language encapsulation helps

– List nodes not visible outside class

Page 40: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

40

Interference

• Freedom from interference needed

even for removed nodes

– Some algorithms traverse removed nodes

– Careful with malloc() & free()!

• Garbage collection helps here

Page 41: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

41

Abstract Data Types

• Concrete representation:

• Abstract Type:

– {a, b}

a b

Page 42: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

42

Abstract Data Types

• Meaning of representation given by

abstraction map

– S( ) ) = {a,b} a b

Page 43: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

43

Rep Invariant

• Which concrete values meaningful?

– Sorted?

– Duplicates?

• Rep invariant

– Characterizes legal concrete reps

– Preserved by methods

– Relied on by methods

Page 44: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

44

Blame Game

• Rep invariant is a contract

• Suppose

– add() leaves behind 2 copies of x

– remove() removes only 1

• Which is incorrect?

Page 45: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

45

Blame Game

• Suppose

– add() leaves behind 2 copies of x

– remove() removes only 1

Page 46: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

46

Blame Game

• Suppose

– add() leaves behind 2 copies of x

– remove() removes only 1

• Which is incorrect?

– If rep invariant says no duplicates

• add() is incorrect

– Otherwise

• remove() is incorrect

Page 47: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

47

Rep Invariant (partly)

• Sentinel nodes

– tail reachable from head

• Sorted

• No duplicates

Page 48: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

48

Abstraction Map

• S(head) =

– { x | there exists a such that

• a reachable from head and

• a.item = x

– }

Page 49: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

49

Sequential List Based Set

a c d

a b c

add()

remove()

Page 50: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

50

Sequential List Based Set

a c d

b

a b c

add()

remove()

Page 51: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

51

Coarse-Grained Locking

a b d

Page 52: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

52

Coarse-Grained Locking

a b d

c

Page 53: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

53

honk!

Coarse-Grained Locking

a b d

c

Simple but hotspot + bottleneck

honk!

Page 54: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

54

Coarse-Grained Locking

• Easy, same as synchronized methods

– “One lock to rule them all …”

Page 55: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

55

Coarse-Grained Locking

• Easy, same as synchronized methods

– “One lock to rule them all …”

• Simple, clearly correct

– Deserves respect!

• Works poorly with contention

– Queue locks help

– But bottleneck still an issue

Page 56: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

56

Fine-grained Locking

• Requires careful thought

– “Do not meddle in the affairs of wizards, for

they are subtle and quick to anger”

Page 57: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

57

Fine-grained Locking

• Requires careful thought

– “Do not meddle in the affairs of wizards, for

they are subtle and quick to anger”

• Split object into pieces

– Each piece has own lock

– Methods that work on disjoint pieces need

not exclude each other

Page 58: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

58

Hand-over-Hand locking

a b c

Page 59: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

59

Hand-over-Hand locking

a b c

Page 60: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

60

Hand-over-Hand locking

a b c

Page 61: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

61

Hand-over-Hand locking

a b c

Page 62: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

62

Hand-over-Hand locking

a b c

Page 63: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

63

Removing a Node

a b c d

remove(b)

Page 64: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

64

Removing a Node

a b c d

remove(b)

Page 65: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

65

Removing a Node

a b c d

remove(b)

Page 66: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

66

Removing a Node

a b c d

remove(b)

Page 67: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

67

Removing a Node

a b c d

remove(b)

Page 68: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

68

Removing a Node

a c d

remove(b) Why hold 2 locks?

Page 69: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

69

Concurrent Removes

a b c d

remove(c) remove(b)

Page 70: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

70

Concurrent Removes

a b c d

remove(b) remove(c)

Page 71: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

71

Concurrent Removes

a b c d

remove(b) remove(c)

Page 72: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

72

Concurrent Removes

a b c d

remove(b) remove(c)

Page 73: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

73

Concurrent Removes

a b c d

remove(b) remove(c)

Page 74: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

74

Concurrent Removes

a b c d

remove(b) remove(c)

Page 75: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

75

Concurrent Removes

a b c d

remove(b) remove(c)

Page 76: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

76

Concurrent Removes

a b c d

remove(b) remove(c)

Page 77: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

77

Concurrent Removes

a b c d

remove(b) remove(c)

Page 78: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

78

Uh, Oh

a c d

remove(b) remove(c)

Page 79: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

79

Uh, Oh

a c d

Bad news, c not removed

remove(b) remove(c)

Page 80: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

80

Problem

• To delete node c

– Swing node b’s next field to d

• Problem is,

– Someone deleting b concurrently could

direct a pointer

to c

b a c

b a c

Page 81: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

81

Insight

• If a node is locked,

– no one can delete node’s successor

• If a thread locks

– node to be deleted

– and its predecessor,

– then it works

Page 82: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

82

Hand-Over-Hand Again

a b c d

remove(b)

Page 83: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

83

Hand-Over-Hand Again

a b c d

remove(b)

Page 84: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

84

Hand-Over-Hand Again

a b c d

remove(b)

Page 85: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

85

Hand-Over-Hand Again

a b c d

remove(b) Found

it!

Page 86: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

86

Hand-Over-Hand Again

a b c d

remove(b) Found

it!

Page 87: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

87

Hand-Over-Hand Again

a c d

remove(b)

Page 88: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

88

Removing a Node

a b c d

remove(b) remove(c)

Page 89: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

89

Removing a Node

a b c d

remove(b) remove(c)

Page 90: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

90

Removing a Node

a b c d

remove(b) remove(c)

Page 91: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

91

Removing a Node

a b c d

remove(b) remove(c)

Page 92: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

92

Removing a Node

a b c d

remove(b) remove(c)

Page 93: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

93

Removing a Node

a b c d

remove(b) remove(c)

Page 94: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

94

Removing a Node

a b c d

remove(b) remove(c)

Page 95: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

95

Removing a Node

a b c d

remove(b) remove(c)

Page 96: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

96

Removing a Node

a b c d

Must

acquire

Lock for

b

remove(c)

Page 97: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

97

Removing a Node

a b c d

Cannot

acquire

lock for b

remove(c)

Page 98: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

98

Removing a Node

a b c d

Wait! remove(c)

Page 99: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

99

Removing a Node

a b d

Proceed

to

remove(b)

Page 100: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

100

Removing a Node

a b d

remove(b)

Page 101: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

101

Removing a Node

a b d

remove(b)

Page 102: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

102

Removing a Node

a d

remove(b)

Page 103: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

103

Removing a Node

a d

Page 104: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

104

Remove method

public boolean remove(Item item) {

int key = item.hashCode();

Node pred, curr;

try {

} finally {

curr.unlock();

pred.unlock();

}}

Page 105: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

105

Remove method

public boolean remove(Item item) {

int key = item.hashCode();

Node pred, curr;

try {

} finally {

curr.unlock();

pred.unlock();

}}

Key used to order node

Page 106: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

106

Remove method

public boolean remove(Item item) {

int key = item.hashCode();

Node pred, curr;

try {

} finally {

currNode.unlock();

predNode.unlock();

}}

Predecessor and current nodes

Page 107: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

107

Remove method

public boolean remove(Item item) {

int key = item.hashCode();

Node pred, curr;

try {

} finally {

curr.unlock();

pred.unlock();

}}

Make sure

locks released

Page 108: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

108

Remove method

public boolean remove(Item item) {

int key = item.hashCode();

Node pred, curr;

try {

} finally {

curr.unlock();

pred.unlock();

}}

Everything else

Page 109: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

109

Remove method

try {

pred = this.head;

pred.lock();

curr = pred.next;

curr.lock();

} finally { … }

Page 110: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

110

Remove method

try {

pred = this.head;

pred.lock();

curr = pred.next;

curr.lock();

} finally { … }

lock pred == head

Page 111: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

111

Remove method

try {

pred = this.head;

pred.lock();

curr = pred.next;

curr.lock();

} finally { … }

Lock current

Page 112: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

112

Remove method

try {

pred = this.head;

pred.lock();

curr = pred.next;

curr.lock();

} finally { … }

Traversing list

Page 113: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

113

Remove: searching

while (curr.key <= key) {

if (item == curr.item) {

pred.next = curr.next;

return true;

}

pred.unlock();

pred = curr;

curr = curr.next;

curr.lock();

}

return false;

Page 114: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

114

Remove: searching

while (curr.key <= key) {

if (item == curr.item) {

pred.next = curr.next;

return true;

}

pred.unlock();

pred = curr;

curr = curr.next;

curr.lock();

}

return false;

Search key range

Page 115: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

115

Remove: searching

while (curr.key <= key) {

if (item == curr.item) {

pred.next = curr.next;

return true;

}

pred.unlock();

pred = curr;

curr = curr.next;

curr.lock();

}

return false;

At start of each loop:

curr and pred locked

Page 116: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

116

Remove: searching

while (curr.key <= key) {

if (item == curr.item) {

pred.next = curr.next;

return true;

}

pred.unlock();

pred = curr;

curr = curr.next;

curr.lock();

}

return false; If item found, remove node

Page 117: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

117

Remove: searching

while (curr.key <= key) {

if (item == curr.item) {

pred.next = curr.next;

return true;

}

pred.unlock();

pred = curr;

curr = curr.next;

curr.lock();

}

return false;

Unlock predecessor

Page 118: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

118

Remove: searching

while (curr.key <= key) {

if (item == curr.item) {

pred.next = curr.next;

return true;

}

pred.unlock();

pred = curr;

curr = curr.next;

curr.lock();

}

return false;

Only one node locked!

Page 119: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

119

Remove: searching

while (curr.key <= key) {

if (item == curr.item) {

pred.next = curr.next;

return true;

}

pred.unlock();

pred = curr;

curr = curr.next;

curr.lock();

}

return false;

demote current

Page 120: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

120

Remove: searching

while (curr.key <= key) {

if (item == curr.item) {

pred.next = curr.next;

return true;

}

pred.unlock();

pred = currNode;

curr = curr.next;

curr.lock();

}

return false;

Find and lock new current

Page 121: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

121

Remove: searching

while (curr.key <= key) {

if (item == curr.item) {

pred.next = curr.next;

return true;

}

pred.unlock();

pred = currNode;

curr = curr.next;

curr.lock();

}

return false;

Lock invariant restored

Page 122: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

122

Remove: searching

while (curr.key <= key) {

if (item == curr.item) {

pred.next = curr.next;

return true;

}

pred.unlock();

pred = curr;

curr = curr.next;

curr.lock();

}

return false;

Otherwise, not present

Page 123: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

124

while (curr.key <= key) {

if (item == curr.item) {

pred.next = curr.next;

return true;

}

pred.unlock();

pred = curr;

curr = curr.next;

curr.lock();

}

return false;

Why remove() is linearizable

•pred reachable from head

•curr is pred.next

•So curr.item is in the set

Page 124: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

125

while (curr.key <= key) {

if (item == curr.item) {

pred.next = curr.next;

return true;

}

pred.unlock();

pred = curr;

curr = curr.next;

curr.lock();

}

return false;

Why remove() is linearizable

Linearization point if

item is present

Page 125: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

126

while (curr.key <= key) {

if (item == curr.item) {

pred.next = curr.next;

return true;

}

pred.unlock();

pred = curr;

curr = curr.next;

curr.lock();

}

return false;

Why remove() is linearizable

Node locked, so no other

thread can remove it ….

Page 126: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

127

while (curr.key <= key) {

if (item == curr.item) {

pred.next = curr.next;

return true;

}

pred.unlock();

pred = curr;

curr = curr.next;

curr.lock();

}

return false;

Why remove() is linearizable

Item not present

Page 127: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

128

while (curr.key <= key) {

if (item == curr.item) {

pred.next = curr.next;

return true;

}

pred.unlock();

pred = curr;

curr = curr.next;

curr.lock();

}

return false;

Why remove() is linearizable

•pred reachable from head

•curr is pred.next •pred.key < key

•key < curr.key

Page 128: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

129

while (curr.key <= key) {

if (item == curr.item) {

pred.next = curr.next;

return true;

}

pred.unlock();

pred = curr;

curr = curr.next;

curr.lock();

}

return false;

Why remove() is linearizable

Linearization point

Page 129: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

130

Adding Nodes

• To add node e

– Must lock predecessor

– Must lock successor

• Neither can be deleted

– (Is successor lock actually required?)

Page 130: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

131

Same Abstraction Map

• S(head) =

– { x | there exists a such that

• a reachable from head and

• a.item = x

– }

Page 131: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

132

Rep Invariant

• Easy to check that

– tail always reachable from head

– Nodes sorted, no duplicates

Page 132: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

133

Drawbacks

• Better than coarse-grained lock

– Threads can traverse in parallel

• Still not ideal

– Long chain of acquire/release

– Inefficient

Page 133: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

134

Optimistic Synchronization

• Find nodes without locking

• Lock nodes

• Check that everything is OK

Page 134: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

135

Optimistic: Traverse without

Locking

b d e a

add(c) Aha!

Page 135: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

136

Optimistic: Lock and Load

b d e a

add(c)

Page 136: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

137

Optimistic: Lock and Load

b d e a

add(c)

c

Page 137: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

138

What could go wrong?

b d e a

add(c) Aha!

Page 138: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

139

What could go wrong?

b d e a

add(c)

Page 139: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

140

What could go wrong?

b d e a

remove(b)

Page 140: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

141

What could go wrong?

b d e a

remove(b)

Page 141: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

142

What could go wrong?

b d e a

add(c)

Page 142: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

143

What could go wrong?

b d e a

add(c)

c

Page 143: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

144

What could go wrong?

d e a

add(c) Uh-oh

Page 144: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

145

Validate – Part 1

b d e a

add(c) Yes, b still

reachable

from head

Page 145: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

146

What Else Could Go Wrong?

b d e a

add(c) Aha!

Page 146: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

147

What Else Coould Go Wrong?

b d e a

add(c)

add(b’)

Page 147: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

148

What Else Coould Go Wrong?

b d e a

add(c)

add(b’) b’

Page 148: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

149

What Else Could Go Wrong?

b d e a

add(c) b’

Page 149: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

150

What Else Could Go Wrong?

b d e a

add(c)

c

Page 150: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

151

Validate Part 2

(while holding locks)

b d e a

add(c) Yes, b still

points to d

Page 151: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

152

Optimistic: Linearization Point

b d e a

add(c)

c

Page 152: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

153

Same Abstraction Map

• S(head) =

– { x | there exists a such that

• a reachable from head and

• a.item = x

– }

Page 153: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

154

Invariants

• Careful: we may traverse deleted nodes

• But we establish properties by

– Validation

– After we lock target nodes

Page 154: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

155

Correctness

• If

– nodes b and c both locked

– node b still accessible

– node c still successor to b

• Then

– neither will be deleted

– OK to delete and return true

Page 155: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

156

Unsuccessful Remove

a b d e

remove(c) Aha!

Page 156: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

157

Validate (1)

a b d e

Yes, b still

reachable

from head

remove(c)

Page 157: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

158

Validate (2)

a b d e

Yes, b still

points to d remove(c)

Page 158: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

159

OK Computer

a b d e

return false remove(c)

Page 159: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

160

Correctness

• If

– nodes b and d both locked

– node b still accessible

– node d still successor to b

• Then

– neither will be deleted

– no thread can add c after b

– OK to return false

Page 160: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

161

Validation

private boolean

validate(Node pred,

Node curr) {

Node node = head;

while (node.key <= pred.key) {

if (node == pred)

return pred.next == curr;

node = node.next;

}

return false;

}

Page 161: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

162

private boolean

validate(Node pred,

Node curr) {

Node node = head;

while (node.key <= pred.key) {

if (node == pred)

return pred.next == curr;

node = node.next;

}

return false;

}

Validation

Predecessor &

current nodes

Page 162: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

163

private boolean

validate(Node pred,

Node curr) {

Node node = head;

while (node.key <= pred.key) {

if (node == pred)

return pred.next == curr;

node = node.next;

}

return false;

}

Validation

Begin at the

beginning

Page 163: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

164

private boolean

validate(Node pred,

Node curr) {

Node node = head;

while (node.key <= pred.key) {

if (node == pred)

return pred.next == curr;

node = node.next;

}

return false;

}

Validation

Search range of keys

Page 164: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

165

private boolean

validate(Node pred,

Node curr) {

Node node = head;

while (node.key <= pred.key) {

if (node == pred)

return pred.next == curr;

node = node.next;

}

return false;

}

Validation

Predecessor reachable

Page 165: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

166

private boolean

validate(Node pred,

Node curr) {

Node node = head;

while (node.key <= pred.key) {

if (node == pred)

return pred.next == curr;

node = node.next;

}

return false;

}

Validation

Is current node next?

Page 166: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

167

private boolean

validate(Node pred,

Node curr) {

Node node = head;

while (node.key <= pred.key) {

if (node == pred)

return pred.next == curr;

node = node.next;

}

return false;

}

Validation

Otherwise move on

Page 167: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

168

private boolean

validate(Node pred,

Node curr) {

Node node = head;

while (node.key <= pred.key) {

if (node == pred)

return pred.next == curr;

node = node.next;

}

return false;

}

Validation Predecessor not reachable

Page 168: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

169

Remove: searching

public boolean remove(Item item) {

int key = item.hashCode();

retry: while (true) {

Node pred = this.head;

Node curr = pred.next;

while (curr.key <= key) {

if (item == curr.item)

break;

pred = curr;

curr = curr.next;

} …

Page 169: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

170

public boolean remove(Item item) {

int key = item.hashCode();

retry: while (true) {

Node pred = this.head;

Node curr = pred.next;

while (curr.key <= key) {

if (item == curr.item)

break;

pred = curr;

curr = curr.next;

} …

Remove: searching

Search key

Page 170: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

171

public boolean remove(Item item) {

int key = item.hashCode();

retry: while (true) {

Node pred = this.head;

Node curr = pred.next;

while (curr.key <= key) {

if (item == curr.item)

break;

pred = curr;

curr = curr.next;

} …

Remove: searching

Retry on synchronization conflict

Page 171: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

172

public boolean remove(Item item) {

int key = item.hashCode();

retry: while (true) {

Node pred = this.head;

Node curr = pred.next;

while (curr.key <= key) {

if (item == curr.item)

break;

pred = curr;

curr = curr.next;

} …

Remove: searching

Examine predecessor and current nodes

Page 172: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

173

public boolean remove(Item item) {

int key = item.hashCode();

retry: while (true) {

Node pred = this.head;

Node curr = pred.next;

while (curr.key <= key) {

if (item == curr.item)

break;

pred = curr;

curr = curr.next;

} …

Remove: searching

Search by key

Page 173: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

174

public boolean remove(Item item) {

int key = item.hashCode();

retry: while (true) {

Node pred = this.head;

Node curr = pred.next;

while (curr.key <= key) {

if (item == curr.item)

break;

pred = curr;

curr = curr.next;

} …

Remove: searching

Stop if we find item

Page 174: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

175

public boolean remove(Item item) {

int key = item.hashCode();

retry: while (true) {

Node pred = this.head;

Node curr = pred.next;

while (curr.key <= key) {

if (item == curr.item)

break;

pred = curr;

curr = curr.next;

} …

Remove: searching

Move along

Page 175: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

176

On Exit from Loop

• If item is present

– curr holds item

– pred just before curr

• If item is absent

– curr has first higher key

– pred just before curr

• Assuming no synchronization problems

Page 176: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

177

Remove Method try {

pred.lock(); curr.lock();

if (validate(pred,curr)) {

if (curr.item == item) {

pred.next = curr.next;

return true;

} else {

return false;

}}} finally {

pred.unlock();

curr.unlock();

}}}

Page 177: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

178

try {

pred.lock(); curr.lock();

if (validate(pred,curr)) {

if (curr.item == item) {

pred.next = curr.next;

return true;

} else {

return false;

}}} finally {

pred.unlock();

curr.unlock();

}}}

Remove Method

Always unlock

Page 178: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

179

try {

pred.lock(); curr.lock();

if (validate(pred,curr)) {

if (curr.item == item) {

pred.next = curr.next;

return true;

} else {

return false;

}}} finally {

pred.unlock();

curr.unlock();

}}}

Remove Method

Lock both nodes

Page 179: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

180

try {

pred.lock(); curr.lock();

if (validate(pred,curr)) {

if (curr.item == item) {

pred.next = curr.next;

return true;

} else {

return false;

}}} finally {

pred.unlock();

curr.unlock();

}}}

Remove Method

Check for synchronization

conflicts

Page 180: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

181

try {

pred.lock(); curr.lock();

if (validate(pred,curr)) {

if (curr.item == item) {

pred.next = curr.next;

return true;

} else {

return false;

}}} finally {

pred.unlock();

curr.unlock();

}}}

Remove Method

target found,

remove node

Page 181: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

182

try {

pred.lock(); curr.lock();

if (validate(pred,curr) {

if (curr.item == item) {

pred.next = curr.next;

return true;

} else {

return false;

}}} finally {

pred.unlock();

curr.unlock();

}}}

Remove Method

target not found

Page 182: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

183

Optimistic List

• Limited hot-spots

– Targets of add(), remove(), contains()

– No contention on traversals

• Moreover

– Traversals are wait-free

– Food for thought …

Page 183: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

184

So Far, So Good

• Much less lock acquisition/release

– Performance

– Concurrency

• Problems

– Need to traverse list twice

– contains() method acquires locks

Page 184: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

185

Evaluation

• Optimistic is effective if

– cost of scanning twice without locks

is less than

– cost of scanning once with locks

• Drawback

– contains() acquires locks

– 90% of calls in many apps

Page 185: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

186

Lazy List

• Like optimistic, except

– Scan once

– contains(x) never locks …

• Key insight

– Removing nodes causes trouble

– Do it “lazily”

Page 186: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

187

Lazy List

• remove()

– Scans list (as before)

– Locks predecessor & current (as before)

• Logical delete

– Marks current node as removed (new!)

• Physical delete

– Redirects predecessor’s next (as before)

Page 187: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

188

Lazy Removal

a a b c d

Page 188: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

c

189

Lazy Removal

a a b d

Present in list

Page 189: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

c

190

Lazy Removal

a a b d

Logically deleted

Page 190: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

191

Lazy Removal

a a b c d

Physically deleted

Page 191: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

192

Lazy Removal

a a b d

Physically deleted

Page 192: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

193

Lazy List

• All Methods

– Scan through locked and marked nodes

– Removing a node doesn’t slow down other

method calls …

• Must still lock pred and curr nodes.

Page 193: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

194

Validation

• No need to rescan list!

• Check that pred is not marked

• Check that curr is not marked

• Check that pred points to curr

Page 194: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

195

Business as Usual

a b c

Page 195: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

196

Business as Usual

a b c

Page 196: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

197

Business as Usual

a b c

Page 197: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

198

Business as Usual

a b c

remove(b)

Page 198: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

199

Business as Usual

a b c

a not

marked

Page 199: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

200

Business as Usual

a b c

a still

points

to b

Page 200: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

201

Business as Usual

a b c

Logical

delete

Page 201: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

202

Business as Usual

a b c

physical

delete

Page 202: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

203

Business as Usual

a b c

Page 203: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

204

New Abstraction Map

• S(head) =

– { x | there exists node a such that

• a reachable from head and

• a.item = x and

• a is unmarked

– }

Page 204: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

205

Invariant

• If not marked, then item in the set

• and reachable from head

• and if not yet traversed, it is reachable

from pred

Page 205: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

206

Validation private boolean

validate(Node pred, Node curr) {

return

!pred.marked &&

!curr.marked &&

pred.next == curr);

}

Page 206: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

207

private boolean

validate(Node pred, Node curr) {

return

!pred.marked &&

!curr.marked &&

pred.next == curr);

}

List Validate Method

Predecessor not

Logically removed

Page 207: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

208

private boolean

validate(Node pred, Node curr) {

return

!pred.marked &&

!curr.marked &&

pred.next == curr);

}

List Validate Method

Current not

Logically removed

Page 208: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

209

private boolean

validate(Node pred, Node curr) {

return

!pred.marked &&

!curr.marked &&

pred.next == curr);

}

List Validate Method

Predecessor still

Points to current

Page 209: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

Art of Multiprocessor Programming 210

Remove try {

pred.lock(); curr.lock();

if (validate(pred,curr) {

if (curr.key == key) {

curr.marked = true;

pred.next = curr.next;

return true;

} else {

return false;

}}} finally {

pred.unlock();

curr.unlock();

}}}

Page 210: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

Art of Multiprocessor Programming 211

Remove try {

pred.lock(); curr.lock();

if (validate(pred,curr) {

if (curr.key == key) {

curr.marked = true;

pred.next = curr.next;

return true;

} else {

return false;

}}} finally {

pred.unlock();

curr.unlock();

}}}

Validate as before

Page 211: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

Art of Multiprocessor Programming 212

Remove try {

pred.lock(); curr.lock();

if (validate(pred,curr) {

if (curr.key == key) {

curr.marked = true;

pred.next = curr.next;

return true;

} else {

return false;

}}} finally {

pred.unlock();

curr.unlock();

}}}

Key found

Page 212: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

Art of Multiprocessor Programming 213

Remove try {

pred.lock(); curr.lock();

if (validate(pred,curr) {

if (curr.key == key) {

curr.marked = true;

pred.next = curr.next;

return true;

} else {

return false;

}}} finally {

pred.unlock();

curr.unlock();

}}}

Logical remove

Page 213: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

Art of Multiprocessor Programming 214

Remove try {

pred.lock(); curr.lock();

if (validate(pred,curr) {

if (curr.key == key) {

curr.marked = true;

pred.next = curr.next;

return true;

} else {

return false;

}}} finally {

pred.unlock();

curr.unlock();

}}}

physical remove

Page 214: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

215

Contains public boolean contains(Item item) {

int key = item.hashCode();

Node curr = this.head;

while (curr.key < key) {

curr = curr.next;

}

return curr.key == key && !curr.marked;

}

Page 215: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

216

Contains public boolean contains(Item item) {

int key = item.hashCode();

Node curr = this.head;

while (curr.key < key) {

curr = curr.next;

}

return curr.key == key && !curr.marked;

}

Start at the head

Page 216: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

217

Contains public boolean contains(Item item) {

int key = item.hashCode();

Node curr = this.head;

while (curr.key < key) {

curr = curr.next;

}

return curr.key == key && !curr.marked;

}

Search key range

Page 217: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

218

Contains public boolean contains(Item item) {

int key = item.hashCode();

Node curr = this.head;

while (curr.key < key) {

curr = curr.next;

}

return curr.key == key && !curr.marked;

}

Traverse without locking

(nodes may have been removed)

Page 218: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

219

Contains public boolean contains(Item item) {

int key = item.hashCode();

Node curr = this.head;

while (curr.key < key) {

curr = curr.next;

}

return curr.key == key && !curr.marked;

}

Present and undeleted?

Page 219: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

220

Summary: Wait-free Contains

a 0 0 0 a b c 0 e 1 d

Use Mark bit + list ordering

1. Not marked in the set

2. Marked or missing not in the set

Page 220: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

221

Lazy List

a 0 0 0 a b c 0 e 1 d

Lazy add() and remove() + Wait-free contains()

Page 221: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

222

Evaluation

• Good:

– contains() doesn’t lock

– In fact, its wait-free!

– Good because typically high % contains()

– Uncontended calls don’t re-traverse

• Bad

– Contended add() and remove() calls do re-traverse

– Traffic jam if one thread delays

Page 222: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

223

Traffic Jam

• Any concurrent data structure based on

mutual exclusion has a weakness

• If one thread

– Enters critical section

– And “eats the big muffin”

• Cache miss, page fault, descheduled …

– Everyone else using that lock is stuck!

– Need to trust the scheduler….

Page 223: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

224

Reminder: Lock-Free Data

Structures

• No matter what …

– Guarantees minimal progress in any

execution

– i.e. Some thread will always complete a

method call

– Even if others halt at malicious times

– Implies that implementation can’t use locks

Page 224: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

225

Lock-free Lists

• Next logical step

– Wait-free contains()

– lock-free add() and remove()

• Use only compareAndSet()

– What could go wrong?

Page 225: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

226

a 0 0 0 a b c 0 e 1 c

Logical Removal

Physical Removal Use CAS to verify pointer

is correct

Not enough!

Lock-free Lists

Page 226: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

227

Problem…

a 0 0 0 a b c 0 e 1 c

Logical Removal

Physical Removal

0 d

Node added

Page 227: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

228

The Solution: Combine Bit and

Pointer

a 0 0 0 a b c 0 e 1 c

Logical Removal =

Set Mark Bit

Physical

Removal

CAS

0 d

Mark-Bit and Pointer

are CASed together

(AtomicMarkableReference)

Fail CAS: Node not

added after logical

Removal

Page 228: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

229

Solution

• Use AtomicMarkableReference

• Atomically

– Swing reference and

– Update flag

• Remove in two steps

– Set mark bit in next field

– Redirect predecessor’s pointer

Page 229: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

230

Marking a Node

• AtomicMarkableReference class

– Java.util.concurrent.atomic package

address F

mark bit

Reference

Page 230: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

231

Extracting Reference & Mark

public Object get(boolean[] marked);

Page 231: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

232

Extracting Reference & Mark

public Object get(boolean[] marked);

Returns

reference

Returns mark at

array index 0!

Page 232: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

233

Extracting Mark Only

public boolean isMarked();

Value of

mark

Page 233: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

234

Changing State

public boolean compareAndSet(

Object expectedRef,

Object updateRef,

boolean expectedMark,

boolean updateMark);

Page 234: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

235

Changing State

public boolean compareAndSet(

Object expectedRef,

Object updateRef,

boolean expectedMark,

boolean updateMark);

If this is the current

reference …

And this is the

current mark …

Page 235: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

236

Changing State

public boolean compareAndSet(

Object expectedRef,

Object updateRef,

boolean expectedMark,

boolean updateMark);

…then change to this

new reference …

… and this new

mark

Page 236: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

237

Changing State

public boolean attemptMark(

Object expectedRef,

boolean updateMark);

Page 237: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

238

Changing State

public boolean attemptMark(

Object expectedRef,

boolean updateMark);

If this is the current

reference …

Page 238: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

239

Changing State

public boolean attemptMark(

Object expectedRef,

boolean updateMark);

.. then change to

this new mark.

Page 239: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

b CAS

240

Removing a Node

a c d

remove

c

Page 240: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

241

Removing a Node

a b d

remove

b

remove

c

c

failed

CAS CAS

Page 241: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

242

Removing a Node

a b d

remove

b

remove

c

c

Page 242: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

243

Removing a Node

a d

remove

b

remove

c

Page 243: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

244

Traversing the List

• Q: what do you do when you find a

“logically” deleted node in your path?

• A: finish the job.

– CAS the predecessor’s next field

– Proceed (repeat as needed)

Page 244: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

245

Lock-Free Traversal

(only Add and Remove)

a b c d CAS

Uh-oh

pred curr pred curr

Page 245: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

246

The Window Class

class Window {

public Node pred;

public Node curr;

Window(Node pred, Node curr) {

this.pred = pred; this.curr = curr;

}

}

Page 246: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

247

The Window Class

class Window {

public Node pred;

public Node curr;

Window(Node pred, Node curr) {

this.pred = pred; this.curr = curr;

}

}

A container for pred

and current values

Page 247: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

248

Using the Find Method

Window window = find(head, key);

Node pred = window.pred;

curr = window.curr;

Page 248: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

249

Using the Find Method

Window window = find(head, key);

Node pred = window.pred;

curr = window.curr;

Find returns window

Page 249: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

250

Using the Find Method

Window window = find(head, key);

Node pred = window.pred;

curr = window.curr;

Extract pred and curr

Page 250: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

251

The Find Method

Window window = find(item);

At some instant,

pred curr succ

item or …

Page 251: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

252

The Find Method

Window window = find(item);

At some instant,

pred curr= null

succ

item not in list

Page 252: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

253

Remove

public boolean remove(T item) {

Boolean snip;

while (true) {

Window window = find(head, key);

Node pred = window.pred, curr = window.curr;

if (curr.key != key) {

return false;

} else {

Node succ = curr.next.getReference();

snip = curr.next.compareAndSet(succ, succ, false true);

if (!snip) continue;

pred.next.compareAndSet(curr, succ, false, false);

return true;

}}}

Page 253: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

254

Remove

public boolean remove(T item) {

Boolean snip;

while (true) {

Window window = find(head, key);

Node pred = window.pred, curr = window.curr;

if (curr.key != key) {

return false;

} else {

Node succ = curr.next.getReference();

snip = curr.next.compareAndSet (succ, succ, false, true);

if (!snip) continue;

pred.next.compareAndSet(curr, succ, false, false);

return true;

}}} Keep trying

Page 254: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

255

Remove

public boolean remove(T item) {

Boolean snip;

while (true) {

Window window = find(head, key);

Node pred = window.pred, curr = window.curr;

if (curr.key != key) {

return false;

} else {

Node succ = curr.next.getReference();

snip = curr.next.compareAndSet (succ, succ, false, true);

if (!snip) continue;

pred.next.compareAndSet(curr, succ, false, false);

return true;

}}} Find neighbors

Page 255: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

256

Remove

public boolean remove(T item) {

Boolean snip;

while (true) {

Window window = find(head, key);

Node pred = window.pred, curr = window.curr;

if (curr.key != key) {

return false;

} else {

Node succ = curr.next.getReference();

snip = curr.next.compareAndSet(succ, succ, false, true);

if (!snip) continue;

pred.next.compareAndSet(curr, succ, false, false);

return true;

}}} She’s not there …

Page 256: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

257

Remove

public boolean remove(T item) {

Boolean snip;

while (true) {

Window window = find(head, key);

Node pred = window.pred, curr = window.curr;

if (curr.key != key) {

return false;

} else {

Node succ = curr.next.getReference();

snip = curr.next.compareAndSet(succ, succ, false, true);

if (!snip) continue;

pred.next.compareAndSet(curr, succ, false, false);

return true;

}}}

Try to mark node as deleted

Page 257: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

258

Remove

public boolean remove(T item) {

Boolean snip;

while (true) {

Window window = find(head, key);

Node pred = window.pred, curr = window.curr;

if (curr.key != key) {

return false;

} else {

Node succ = curr.next.getReference();

snip = curr.next.compareAndSet(succ, succ, false, true);

if (!snip) continue;

pred.next.compareAndSet(curr, succ, false, false);

return true;

}}}

If it doesn’t work,

just retry, if it

does, job

essentially done

Page 258: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

259

Remove

public boolean remove(T item) {

Boolean snip;

while (true) {

Window window = find(head, key);

Node pred = window.pred, curr = window.curr;

if (curr.key != key) {

return false;

} else {

Node succ = curr.next.getReference();

snip = curr.next.compareAndSet(succ, succ, false, true);

if (!snip) continue;

pred.next.compareAndSet(curr, succ, false, false);

return true;

}}}

Try to advance reference

(if we don’t succeed, someone else did or will).

a

Page 259: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

260

Add public boolean add(T item) {

boolean splice;

while (true) {

Window window = find(head, key);

Node pred = window.pred, curr = window.curr;

if (curr.key == key) {

return false;

} else {

Node node = new Node(item);

node.next = new AtomicMarkableRef(curr, false);

if (pred.next.compareAndSet(curr, node, false, false))

{ return true; }

}}}

Page 260: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

261

Add public boolean add(T item) {

boolean splice;

while (true) {

Window window = find(head, key);

Node pred = window.pred, curr = window.curr;

if (curr.key == key) {

return false;

} else {

Node node = new Node(item);

node.next = new AtomicMarkableRef(curr, false);

if (pred.next.compareAndSet(curr, node, false, false))

{return true;}

}}} Item already there.

Page 261: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

262

Add public boolean add(T item) {

boolean splice;

while (true) {

Window window = find(head, key);

Node pred = window.pred, curr = window.curr;

if (curr.key == key) {

return false;

} else {

Node node = new Node(item);

node.next = new AtomicMarkableRef(curr, false);

if (pred.next.compareAndSet(curr, node, false, false))

{return true;}

}}}

create new node

Page 262: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

263

Add public boolean add(T item) {

boolean splice;

while (true) {

Window window = find(head, key);

Node pred = window.pred, curr = window.curr;

if (curr.key == key) {

return false;

} else {

Node node = new Node(item);

node.next = new AtomicMarkableRef(curr, false);

if (pred.next.compareAndSet(curr, node, false, false))

{return true;}

}}}

Install new node,

else retry loop

Page 263: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

264

Wait-free Contains

public boolean contains(T item) {

boolean marked;

int key = item.hashCode();

Node curr = this.head;

while (curr.key < key)

curr = curr.next;

Node succ = curr.next.get(marked);

return (curr.key == key && !marked[0])

}

Page 264: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

265

Wait-free Contains

public boolean contains(T item) {

boolean marked;

int key = item.hashCode();

Node curr = this.head;

while (curr.key < key)

curr = curr.next;

Node succ = curr.next.get(marked);

return (curr.key == key && !marked[0])

}

Only diff is that we

get and check

marked

Page 265: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

266

Lock-free Find public Window find(Node head, int key) {

Node pred = null, curr = null, succ = null;

boolean[] marked = {false}; boolean snip;

retry: while (true) {

pred = head;

curr = pred.next.getReference();

while (true) {

succ = curr.next.get(marked);

while (marked[0]) {

}

if (curr.key >= key)

return new Window(pred, curr);

pred = curr;

curr = succ;

}

}}

Page 266: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

267

Lock-free Find public Window find(Node head, int key) {

Node pred = null, curr = null, succ = null;

boolean[] marked = {false}; boolean snip;

retry: while (true) {

pred = head;

curr = pred.next.getReference();

while (true) {

succ = curr.next.get(marked);

while (marked[0]) {

}

if (curr.key >= key)

return new Window(pred, curr);

pred = curr;

curr = succ;

}

}}

If list changes

while traversed,

start over

Page 267: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

268

public Window find(Node head, int key) {

Node pred = null, curr = null, succ = null;

boolean[] marked = {false}; boolean snip;

retry: while (true) {

pred = head;

curr = pred.next.getReference();

while (true) {

succ = curr.next.get(marked);

while (marked[0]) {

}

if (curr.key >= key)

return new Window(pred, curr);

pred = curr;

curr = succ;

}

}}

Lock-free Find

Start looking from head

Page 268: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

269

public Window find(Node head, int key) {

Node pred = null, curr = null, succ = null;

boolean[] marked = {false}; boolean snip;

retry: while (true) {

pred = head;

curr = pred.next.getReference();

while (true) {

succ = curr.next.get(marked);

while (marked[0]) {

}

if (curr.key >= key)

return new Window(pred, curr);

pred = curr;

curr = succ;

}

}}

Lock-free Find

Move down the list

Page 269: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

270

public Window find(Node head, int key) {

Node pred = null, curr = null, succ = null;

boolean[] marked = {false}; boolean snip;

retry: while (true) {

pred = head;

curr = pred.next.getReference();

while (true) {

succ = curr.next.get(marked);

while (marked[0]) {

}

if (curr.key >= key)

return new Window(pred, curr);

pred = curr;

curr = succ;

}

}}

Lock-free Find

Get ref to successor and

current deleted bit

Page 270: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

271

public Window find(Node head, int key) {

Node pred = null, curr = null, succ = null;

boolean[] marked = {false}; boolean snip;

retry: while (true) {

pred = head;

curr = pred.next.getReference();

while (true) {

succ = curr.next.get(marked);

while (marked[0]) {

}

if (curr.key >= key)

return new Window(pred, curr);

pred = curr;

curr = succ;

}

}}

Lock-free Find

Try to remove deleted nodes in

path…code details soon

Page 271: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

272

public Window find(Node head, int key) {

Node pred = null, curr = null, succ = null;

boolean[] marked = {false}; boolean snip;

retry: while (true) {

pred = head;

curr = pred.next.getReference();

while (true) {

succ = curr.next.get(marked);

while (marked[0]) {

}

if (curr.key >= key)

return new Window(pred, curr);

pred = curr;

curr = succ;

}

}}

Lock-free Find

If curr key that is greater or

equal, return pred and curr

Page 272: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

273

public Window find(Node head, int key) {

Node pred = null, curr = null, succ = null;

boolean[] marked = {false}; boolean snip;

retry: while (true) {

pred = head;

curr = pred.next.getReference();

while (true) {

succ = curr.next.get(marked);

while (marked[0]) {

}

if (curr.key >= key)

return new Window(pred, curr);

pred = curr;

curr = succ;

}

}}

Lock-free Find

Otherwise advance window and

loop again

Page 273: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

274

Lock-free Find

retry: while (true) {

while (marked[0]) {

snip = pred.next.compareAndSet(curr,

succ, false, false);

if (!snip) continue retry;

curr = succ;

succ = curr.next.get(marked);

}

Page 274: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

275

Lock-free Find

retry: while (true) {

while (marked[0]) {

snip = pred.next.compareAndSet(curr,

succ, false, false);

if (!snip) continue retry;

curr = succ;

succ = curr.next.get(marked);

}

Try to snip out node

Page 275: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

276

Lock-free Find

retry: while (true) {

while (marked[0]) {

snip = pred.next.compareAndSet(curr,

succ, false, false);

if (!snip) continue retry;

curr = succ;

succ = curr.next.get(marked);

}

if predecessor’s next field changed,

retry whole traversal

Page 276: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

277

Lock-free Find

retry: while (true) {

while (marked[0]) {

snip = pred.next.compareAndSet(curr,

succ, false, false);

if (!snip) continue retry;

curr = succ;

succ = curr.next.get(marked);

}

Otherwise move on to check

if next node deleted

Page 277: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

Performance

• Different list-based set implementations

• 16-node machine

• Vary percentage of contains() calls

278

Page 278: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

279

High Contains Ratio

Lock-free

Lazy list

Coarse Grained Fine Lock-coupling

Page 279: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

280

Low Contains Ratio

Lock-free

Lazy list

Coarse Grained

Fine Lock-coupling

Page 280: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

281

As Contains Ratio Increases

Lock-free

Lazy list

Coarse Grained

Fine Lock-coupling

% Contains()

Page 281: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

282

Summary

• Coarse-grained locking

• Fine-grained locking

• Optimistic synchronization

• Lazy synchronization

• Lock-free synchronization

Page 282: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

283

“To Lock or Not to Lock”

• Locking vs. Non-blocking:

– Extremist views on both sides

• The answer: nobler to compromise

– Example: Lazy list combines blocking add()

and remove()and a wait-free contains()

– Remember: Blocking/non-blocking is a property

of a method

Page 283: Programming Paradigms for Concurrency · This Lecture • Introduce four “patterns” –Bag of tricks … –Methods that work more than once … • For highly-concurrent objects

284

This work is licensed under a Creative Commons Attribution-

ShareAlike 2.5 License.

• You are free: – to Share — to copy, distribute and transmit the work

– to Remix — to adapt the work

• Under the following conditions: – Attribution. You must attribute the work to “The Art of Multiprocessor

Programming” (but not in any way that suggests that the authors endorse you or your use of the work).

– Share Alike. If you alter, transform, or build upon this work, you may distribute the resulting work only under the same, similar or a compatible license.

• For any reuse or distribution, you must make clear to others the license terms of this work. The best way to do this is with a link to

– http://creativecommons.org/licenses/by-sa/3.0/.

• Any of the above conditions can be waived if you get permission from the copyright holder.

• Nothing in this license impairs or restricts the author's moral rights.