Concurrency Patterns
-
Upload
melbournepatterns -
Category
Technology
-
view
5.847 -
download
2
description
Transcript of Concurrency Patterns
Concurrency Patterns
David KempMelbourne Patterns Group
March 2010
Some rights reserved: Creative Commons Attribution-Noncommercial-Share Alikehttp://creativecommons.org/licenses/by-nc-sa/3.0/
Concurrency: what and why?
ThreadThread
Stack
Code
HeapStack
Issues
Race Conditions
public class BankAccount {
private int balance; public void adjustBalance(int amount) { balance = balance + amount; }...}
Memory Consistency (A)
Initially
Thread B
Instructions may be re-ordered
a = true;b = true;
return !b | a;
boolean a = false;boolean b = false;
Thread A
Possible for Thread B to see b as true before a is true.
Memory Consistency (B)
Initially
Thread B
Partially constructed objects can be visible
object = new MyClass(); if (object != null) object.doSomething();
MyClass object = null;
Thread A
object may not be in a consistent state in thread B
If Possible:Avoid Concurrency!!
Concurrency Primitives
Threads (in Java)
Runnable runnable = new MyRunnable(); Thread thread = new Thread(runnable);thread.start();
interface Runnable { void run();}
Looks strangely like the command pattern(covered last month).
The Java ExecutorService interface is even more like the Command Pattern.
Mutex (Mutual Exclusion Lock)
Mutexes can fix race conditions
public class BankAccount { Object lock = new Object(); int balance;
public void adjustBalance(int amount) { synchronize(lock) { balance = balance + amount; } }
Mutexes can fix Memory ConsistencyInitially
Thread B
synchronize(lock) { a = true; b = true;}
synchronize(lock) { return !b | a;}
Object lock = new Object();boolean a = false;boolean b = false;
Thread A Must use the same lock!
Can also fix some memory consistencyproblems using the volatile keyword.
If you need clever analysis to show thread safety, then it is either broken now, or will be broken by some future
maintainer!!!!
Other Concurrency Abstractions• Condition Variables• Semaphores.• Latches.• Barriers.• Futures.• Read/Write Locks.• Blocking Queues.• Exchangers.• Threadpools.• Atomic Compare-And-Set
Some Patterns
Fully Synchronized Objects
Photo by Kevin Hamm. Some rights reserved.See: http://www.flickr.com/photos/krhamm/171302278/in/set-72157594171880205/
Fully Synchronized Object
All methods on a fully synchronized objectare synchronized on a single lock.
Resource Ordering
Image by Benjamin D. Esham for the Wikimedia Commons.Some rights reserved.See: http://en.wikipedia.org/wiki/File:Dining_philosophers.png/
Copy-on-write
Passing immutable objects as messages between threads.
Concurrent modification ceases to be a problem!
Partitioning
Double Check LockingUsed for lazy initialization
Photo by Kirainet. Some rights reserved.See: http://www.flickr.com/photos/torek/2467519466/
Double Check LockingEasy to stuff up!!!
Double Check LockingWas not possible in Java before 1.5.
Locks have become cheap, and so double-check not so useful.Usually better to use static initialization anyway.
Was unreliable in C++/Posix threads when I last looked.Find out if it works in your language/platform before using!!
Double Check Locking
But it is a nice demonstration of some concurrency issues
Double check locking(Warning: did not work before Java 1.5)
volatile Properties properties = null;final Object lock = new Object();
public Properties getProperties() { if (properties == null) { synchronized (lock) { if (properties == null) { tmp = new Properties(); tmp.load(inputStream); properties = tmp; } } } return properties;}
Possibly broken!Definitely Brittle!
Lock-free Queue
Lock Free Queue
Queue
Dummy Node
Real Head Node Tail
Penultimate node
Head
Tail: Might point to last or second last node!
References are all updated using the Atomic Test-And-Set.
References
• M. Ben-Ari, Principles of Concurrent Programming, Prentice Hall.
• Doug Lea, Concurrent Programming in Java Second Edition. Design Principles and Patterns, Addison-Wesley.
• Brian Goetz, Java Concurrency in Practice. Pearson Education.
• Software Engineering Radio, Episodes 12, 19, and 29. http://www.se-radio.net/