- synchronized
- check condition again after wake up and in a loop
- while(condition is not true) obj.wait();
- missed signals
- spurious wakeups
- interruptible, timeout(tryAcquire)
CountDownLatch
- countDown, await
- can't reuse
- work even if countDown is called before await (unlike wait, notify - missing notification)
CyclicBarrier
- synchronize some tasks at a common point
- reusable
Double-checked locking
- check null again inside the critical block
Volatile
- modification to the field is immediately seen by other threads
- not cached in registers, force main memory access
How to Prevent Deadlock
- same lock ordering
- lock timeout, tryAcquire
Implementing
- Threads that print odd, even numbers
BoundedBuffer
BlockingQueue
- drainTo
- Condition: notFull, notEmpty
Implement Lock using synchronized
Implement ReadWriteLock
Implementing (Thread Safe) Stack
- AtomicReference, CAS
Develop a software to count number of events in last 5 mins
- AtomicLongArray, PositionUpdater
counter.set((pos + 1)%GRANULARITY, 0);
pos = (pos + 1)%GRANULARITY;
Write a program which keeps min and max value in threadsafe way
- AtomicInteger
H2O
Blocking Queue
LinkedBlockingQueue
ArrayBlockingQueue
PriorityBlockingQueue
DelayQueue
ThreadPool
newCachedThreadPool
- Use SynchronousQueue, may use too many threads
newFixedThreadPool, newSingleThreadExecutor
- Use LinkedBlockingQueue, may use too much memory
- Be cautious about unbounded resource - thread, memory
- lock, condition
- synchronizedList/Set/Map
- Optimistic Lock: AtomicXXX
Wait, Notify(All)- Optimistic Lock: AtomicXXX
- Threadpool
- check condition again after wake up and in a loop
- while(condition is not true) obj.wait();
- missed signals
- spurious wakeups
Lock
- replaces synchronized
Condition
- suspend thread's execution, until the condition is true.
- a lock can have multiple (conditions) wait-sets per object
- replaces monitor methods
ReentrantLock- interruptible, timeout(tryAcquire)
Semaphore
- n permits, acquire, release
- Limiting concurrent access
- countDown, await
- can't reuse
- work even if countDown is called before await (unlike wait, notify - missing notification)
- synchronize some tasks at a common point
- reusable
Double-checked locking
- check null again inside the critical block
Volatile
- modification to the field is immediately seen by other threads
- not cached in registers, force main memory access
- no reorder
- happens-before
any memory writes by one statement are visible to another statement.
Use Volatile
- When Writes Do Not Depend on Its Current Value
- Use Volatile Fields for Reading and Locks for Writing
Implementing CopyOnWriteArrayList
- private transient volatile Object[] array;
- Use lock in set(index, element)
- happens-before
any memory writes by one statement are visible to another statement.
Use Volatile
- When Writes Do Not Depend on Its Current Value
- Use Volatile Fields for Reading and Locks for Writing
Implementing CopyOnWriteArrayList
- private transient volatile Object[] array;
- Use lock in set(index, element)
AtomicXXX
- CAS
- One instruction, retry infinitely until it succeeds
ConcurrentHashMap
ConcurrentLinkedQueue
- CAS, headNode, taiNode
How to Prevent Deadlock
- same lock ordering
- lock timeout, tryAcquire
Implementing
- Threads that print odd, even numbers
BoundedBuffer
BlockingQueue
- drainTo
Implement Lock using synchronized
Implement ReadWriteLock
Implementing (Thread Safe) Stack
- AtomicReference, CAS
Develop a software to count number of events in last 5 mins
- AtomicLongArray, PositionUpdater
counter.set((pos + 1)%GRANULARITY, 0);
pos = (pos + 1)%GRANULARITY;
Write a program which keeps min and max value in threadsafe way
- AtomicInteger
H2O
Blocking Queue
LinkedBlockingQueue
ArrayBlockingQueue
PriorityBlockingQueue
DelayQueue
ThreadPool
newCachedThreadPool
- Use SynchronousQueue, may use too many threads
newFixedThreadPool, newSingleThreadExecutor
- Use LinkedBlockingQueue, may use too much memory
- Be cautious about unbounded resource - thread, memory