Java Concurrency


- synchronized

- lock, condition
- synchronizedList/Set/Map
- Optimistic Lock: AtomicXXX

- Threadpool
Wait, Notify(All)
- 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

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
- 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)

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

- 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

Labels

adsense (5) Algorithm (69) Algorithm Series (35) Android (7) ANT (6) bat (8) Big Data (7) Blogger (14) Bugs (6) Cache (5) Chrome (19) Code Example (29) Code Quality (7) Coding Skills (5) Database (7) Debug (16) Design (5) Dev Tips (63) Eclipse (32) Git (5) Google (33) Guava (7) How to (9) Http Client (8) IDE (7) Interview (88) J2EE (13) J2SE (49) Java (186) JavaScript (27) JSON (7) Learning code (9) Lesson Learned (6) Linux (26) Lucene-Solr (112) Mac (10) Maven (8) Network (9) Nutch2 (18) Performance (9) PowerShell (11) Problem Solving (11) Programmer Skills (6) regex (5) Scala (6) Security (9) Soft Skills (38) Spring (22) System Design (11) Testing (7) Text Mining (14) Tips (17) Tools (24) Troubleshooting (29) UIMA (9) Web Development (19) Windows (21) xml (5)