Professional Documents
Culture Documents
《java并发编程的艺术》迷你书
《java并发编程的艺术》迷你书
4
Java ...................................................................................................................... 6
1.1
1.2
1.3
1.4
1.5
ConcurrentHashMap .......................................................................................... 6
1.1.1
ConcurrentHashMap ............................................................................. 6
1.1.2
ConcurrentHashMap .............................................................................. 7
1.1.3
ConcurrentHashMap .......................................................................................... 7
1.1.4
ConcurrentHashMap ...................................................................................... 9
1.1.5
Segment .............................................................................................................. 11
1.1.6
1.1.7
1.1.8
ConcurrentLinkedQueue .................................................................................. 13
1.2.1
ConcurrentLinkedQueue .................................................................................. 14
1.2.2
ConcurrentLinkedQueue .................................................................................. 14
1.2.3
......................................................................................................................... 15
1.2.4
......................................................................................................................... 18
Java ...................................................................................................... 19
1.3.1
............................................................................................. 19
1.3.2
............................................................................................................. 20
1.3.3
..................................................................................................... 21
1.3.4
..................................................................................................... 21
1.3.5
............................................................................................................. 22
1.3.6
............................................................................................................. 22
1.3.7
..................................................................................................... 24
1.3.8
............................................................................................................. 25
Java .................................................................................................................. 26
1.4.1
..................................................................................................... 26
1.4.2
Java ...................................................................................................... 27
1.4.3
ArrayBlockingQueue ................................................................................................... 27
1.4.4
LinkedBlockingQueue ................................................................................................. 28
1.4.5
PriorityBlockingQueue ................................................................................................ 28
1.4.6
DelayQueue ................................................................................................................. 28
1.4.7
SynchronousQueue ...................................................................................................... 30
1.4.8
LinkedTransferQueue .................................................................................................. 31
1.4.9
LinkedBlockingDeque ................................................................................................. 31
1.4.10
............................................................................................... 32
Fork/Join .......................................................................................................................... 35
1.5.1
Fork/Join ................................................................................................ 35
1.5.2
............................................................................................................. 36
1.5.3
Fork/Join .................................................................................................. 38
1.5.4
ForkJoin ................................................................................................. 38
1.5.5
Fork/Join .......................................................................................... 40
2
1.5.6
1.6
Fork/Join .......................................................................................... 40
................................................................................................................................. 42
Java ............................................................................................... 43
1.7
1.8
1.9
1.10
Volatile ................................................................................................................. 43
1.7.1
.................................................................................................................... 43
1.7.2
Volatile .................................................................................................... 44
1.7.3
Volatile ............................................................................................... 44
1.7.4
Volatile .................................................................................................... 44
1.7.5
Volatile .................................................................................................... 45
Synchronized ....................................................................................................... 47
1.8.1
................................................................................................................. 47
1.8.2
................................................................................................................. 47
1.8.3
Java .................................................................................................................. 48
1.8.4
..................................................................................................................... 49
1.8.5
......................................................................................................................... 49
1.8.6
..................................................................................................................... 52
1.8.7
......................................................................................................... 53
1.8.8
6 .................................................................................................................. 53
............................................................................................................. 53
1.9.1
..................................................................................................................... 53
1.9.2
......................................................................................... 54
1.9.3
................................................................. 54
1.9.4
............................................................................................. 55
1.9.5
............................................................................................. 56
1.9.6
Java .............................................................................................. 56
1.9.7
CAS .................................................................................... 56
1.9.8
......................................................................................... 60
............................................................................................................................... 60
InfoQ
Java
Java 7 Java 8 JVM
GroovyScalaClojureCeylon JVM Java
Java JVM
Java Java
Java
JVM Java JVM Java
Java
Java SSHStruts
Spring Hibernate
Java SSHSSH Java
InfoQ
Java
InfoQ Java
Java
4
Java
http://ifeve.com/
Java
InfoQ Java
Java
Java
Doug Lea Java
1.1
ConcurrentHashMap
ConcurrentHashMap HashMap
1.1.1 ConcurrentHashMap
HashMap HashMap put
CPU 100% HashMap
final HashMap<String, String> map = new HashMap<String, String>(2);
HashTableHashTable synchronized
HashTable HashTable
HashTable 1 put
2 put get
6
ConcurrentHashMap
1.1.2 ConcurrentHashMap
HashTable HashTable
ConcurrentHashMap
1.1.3 ConcurrentHashMap
ConcurrentHashMap ConcurrentHashMap 9-1
1-1
ConcurretnHashMap
Segment[]
HashEntry[]
Segment1
HashEntry1.1
Segment2
HashEntry1.2
HashEntry2.1
1-2
1.1.4 ConcurrentHashMap
ConcurrentHashMap initialCapacityloadFactor, concurrencyLevel
segments segmentShift segmentMask segment HashEntry
10
1.1.5 Segment
ConcurrentHashMap Segment
Segment ConcurrentHashMap Wang/Jenkins
hash hashCode
private static int hash(int h) {
h += (h << 15) ^ 0xffffcd7d;
h ^= (h >>> 10);
h += (h << 3);
h ^= (h >>> 6);
h += (h << 2) + (h << 14);
return h ^ (h >>> 16);
}
Segment
Segment
15
32 0
01000111011001111101101001001110
11110111010000110000000110111000
01110111011010010100011000111110
10000011000000001100100000011010
ConcurrentHashMap segment
final Segment<K,V> segmentFor(int hash) {
return segments[(hash >>> segmentShift) & segmentMask];
}
segmentShift 28segmentMask 15 32
28 4 hash (hash >>> segmentShift) & segmentMask
11
4157 8 hash
get get
HashTable get ConcurrentHashMap get
get volatile Segement
count HashEntry value volatile
get count
value java happen before
volatile volatile get
volatile
transient volatile int count;
volatile V value;
HashEntry Segment
Segment hashcode
HashEntry
Segment HashEntry
hash >>> segmentShift) & segmentMask// Segment hash
int index = hash & (tab.length - 1);// HashEntry hash
Segment HashEntry
HashEntry
Segment HashEntry threshold
Segment HashMap
HashMap
HashMap
hash ConcurrentHashMap
segment
1.2
ConcurrentLinkedQueue
13
CAS Doug Lea
ConcurrentLinkedQueue
1.2.1 ConcurrentLinkedQueue
ConcurrentLinkedQueue
1.2.2 ConcurrentLinkedQueue
ConcurrentLinkedQueue 8-1
1-3
14
1.2.3
head
tair 8-2
1-4
head next 1
2
2 1 next 2 tail
2
3
3 tail next 3
4 3 next 4 tail 4
debug head tail
tail tail next
tail tail next tail
next tail
15
CAS
public boolean offer(E e) {
if (e == null) throw new NullPointerException();
//
Node<E> n = new Node<E>(e);
retry:
//
for (;;) {
// tail
Node<E> t = tail;
//p tail
Node<E> p = t;
for (int hops = 0; ; hops++) {
// p
Node<E> next = succ(p);
//next p p next
if (next != null) {
//
if (hops > HOPS && t != tail)
continue retry;
p = next;
}
// p p next
else if (p.casNext(null, n)) {
// tail 1 next tair
tair
if (hops >= HOPS)
casTail(t, n); // tail
return true;
}
// p next , p next p
else {
p = succ(p);
}
}
}
}
CAS
next
16
tail tail
tail tail next if tail
next next tail next p
p next p p next
head p next
final Node<E> succ(Node<E> p) {
Node<E> next = p.getNext();
return (p == next) ? head : next;
}
p.casNext(null, n)
next p null p null
hops
doug lea
public boolean offer(E e) {
if (e == null)
throw new NullPointerException();
Node<E> n = new Node<E>(e);
for (;;) {
Node<E> t = tail;
if (t.casNext(null, n) && casTail(t, n)) {
return true;
}
}
}
tail
CAS tail CAS tail
doug lea hops tail
tail tail
HOPS 1 tail tail CAS tail
private static final int HOPS = 1;
true
1.2.4
head 8-3
1-5
public E poll() {
Node<E> h = head;
// p
Node<E> p = h;
for (int hops = 0;; hops++) {
18
// p
E item = p.getItem();
// p CAS p null,
p
if (item != null && p.casItem(item, null)) {
if (hops >= HOPS) {
// p head
Node<E> q = p.getNext();
updateHead(h, (q != null) ? q : p);
}
return item;
}
//
p
Node<E> next = succ(p);
// p
if (next == null) {
//
updateHead(h, p);
break;
}
//
p = next;
}
return null;
}
CAS
null CAS
head
1.3
Java
1.3.1
19
1.3.2
ThreadPoolExecutor
new
milliseconds,runnableTaskQueue, handler);
q corePoolSize
prestartAllCoreThreads
q runnableTaskQueue
1)
ArrayBlockingQueue FIFO
2)
LinkedBlockingQueue FIFO
ArrayBlockingQueue
Executors.newFixedThreadPool()
3)
SynchronousQueue
LinkedBlockingQueue
Executors.newCachedThreadPool
4)
PriorityBlockingQueue
5)
maximumPoolSize
6)
ThreadFactory
20
7)
RejectedExecutionHandler
AbortPolicy
1.3.3
JDK1.5 Java
q AbortPolicy
q CallerRunsPolicy
q DiscardOldestPolicy
q DiscardPolicy
RejectedExecutionHandler
q keepAliveTime
q TimeUnitDAYSHOURS
MINUTES(MILLISECONDS)(MICROSECONDS, )
(NANOSECONDS, )
1.3.4
execute execute
execute Runnable
threadsPool.execute(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
}
});
submit
future, future
1.3.5
shutdown shutdownNow
interrupt
shutdownNow STOP
shutdown
SHUTDOWN
isShutdown true
, isTerminaed true
shutdown
shutdownNow
1.3.6
1-6
22
1-6
1)
2)
3)
23
else if (!addIfUnderMaximumPoolSize(command))
// RejectedExecutionException
reject(command); // is shutdown or saturated
}
}
: WorkerWorker
Worker run
public void run() {
try {
Runnable task = firstTask;
firstTask = null;
while (task != null || (task = getTask()) != null) {
runTask(task);
task = null;
}
} finally {
workerDone(this);
}
}
1.3.7
q CPU IO
q
q
q
CPU
Ncpu+1 IO
2*Ncpu CPU
IO
Runtime.getRuntime().availableProcessors() CPU
PriorityBlockingQueue
24
SQL
CPU CPU
SQL
1.3.8
taskCount
completedTaskCount taskCount
largestPoolSize
getPoolSize:
getActiveCount
beforeExecuteafterExecute
terminated
25
1.4
Java
Java Java7
1.4.1
BlockingQueue
1)
2)
1-2 :
1-1
add(e)
offer(e)
put(e)
offer(e,time,unit)
remove()
poll()
take()
poll(time,unit)
element()
peek()
q IllegalStateException("Queue full")
NoSuchElementException
q true
null
q put
take
2 put take
toffer poll o
26
put offer
offer true
1.4.2 Java
JDK7 7
1)
ArrayBlockingQueue
2)
LinkedBlockingQueue
3)
PriorityBlockingQueue
4)
DelayQueue
5)
SynchronousQueue
6)
LinkedTransferQueue
7)
LinkedBlockingDeque
1.4.3 ArrayBlockingQueue
ArrayBlockingQueue FIFO
ArrayBlockingQueue(1000,true);
lock.newCondition();
27
1.4.4 LinkedBlockingQueue
LinkedBlockingQueue
Integer.MAX_VALUE
1.4.5 PriorityBlockingQueue
PriorityBlockingQueue
compareTo PriorityBlockingQueue
Comparator
1.4.6 DelayQueue
DelayQueue PriorityQueue
Delayed
DelayQueue DelayQueue
q
DelayQueue
DelayQueue DelayQueue
DelayQueue
DelayQueue TimerQueue DelayQueue
1.
Delayed
DelayQueue Delayed ScheduledThreadPoolExecutor
ScheduledFutureTask
time sequenceNumber
28
getDelay
ns
getDelay
time getDelay
compareTo
29
2.
leader leader
await leader
leader awaitNanos delay
1.4.7 SynchronousQueue
SynchronousQueue put take
SynchronousQueue true
public SynchronousQueue(boolean fair) {
transferer = fair ? new TransferQueue() : new TransferStack();
}
SynchronousQueue
SynchronousQueue
LinkedBlockingQueue ArrayBlockingQueue
30
1.4.8 LinkedTransferQueue
LinkedTransferQueue TransferQueue
LinkedTransferQueue tryTransfer transfer
transfer take()
poll()transfer transfer
transfer tail
transfer
Node pred = tryAppend(s, haveData);
return awaitMatch(s, pred, e, (how == TIMED), nanos);
s tail CPU
CPU Thread.yield()
tryTransfer
false transfer tryTransfer
transfer
tryTransfer(E e, long timeout, TimeUnit unit)
false true
1.4.9 LinkedBlockingDeque
LinkedBlockingDeque
LinkedBlockingDeque addFirstaddLastofferFirst
offerLastpeekFirstpeekLast First peek
Last
31
1.4.10
JDK
JDK
ArrayBlockingQueue Condition
private final Condition notFull;
private final Condition notEmpty;
lock.newCondition();
32
try {
while (count == 0)
notEmpty.await();
return extract();
} finally {
lock.unlock();
}
}
LockSupport.park(this)
setBlocker unsafe.park
33
unsafe.park(false, 0L);
setBlocker(t, null);
}
unsafe.park native
public native void park(boolean isAbsolute, long time);
park
1)
2)
3)
time
4)
34
<0x0000000140559fe8> (a
java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
at
java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSy
nchronizer.java:2043)
at java.util.concurrent.ArrayBlockingQueue.put(ArrayBlockingQueue.java:324)
at blockingqueue.ArrayBlockingQueueTest.main(ArrayBlockingQueueTest.java:11)
1.5
Fork/Join
1.5.1 Fork/Join
Fork/Join Java7
1+2+10000 10 1
10 Fork/Join 1-7
1-7
1.5.2
work-stealing
1-8
36
1-8
A
A
37
1.5.3 Fork/Join
Fork/Join
Fork/Join Fork/Join
1
fork
Fork/Join
1)
2)
RecursiveAction
RecursiveTask
1.5.4 ForkJoin
ForkJoin 1+2+3+4
ForkJoin
2 4 ForkJoin
fork 1+2 3+4 join
RecursiveTask
package fj;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.Future;
38
import java.util.concurrent.RecursiveTask;
@Override
protected Integer compute() {
int sum = 0;
//
boolean canCompute = (end - start) <= THRESHOLD;
if (canCompute) {
for (int i = start; i <= end; i++) {
sum += i;
}
} else {
//
int middle = (start + end) / 2;
CountTask leftTask = new CountTask(start, middle);
CountTask rightTask = new CountTask(middle + 1, end);
//
leftTask.fork();
rightTask.fork();
//
int leftResult=leftTask.join();
int rightResult=rightTask.join();
//
sum = leftResult
+ rightResult;
}
return sum;
}
39
ForkJoinTaskForkJoinTask
compute
fork compute
join
1.5.5 Fork/Join
ForkJoinTask
ForkJoinTask isCompletedAbnormally()
ForkJoinTask getException
if(task.isCompletedAbnormally())
{
System.out.println(task.getException());
}
1.5.6 Fork/Join
ForkJoinPool ForkJoinTask ForkJoinWorkerThread ForkJoinTask
40
ForkJoinPool ForkJoinWorkerThread
ForkJoinTask fork ForkJoinTask fork
ForkJoinWorkerThread pushTask
public final ForkJoinTask<V> fork() {
((ForkJoinWorkerThread) Thread.currentThread())
.pushTask(this);
return this;
}
// or use putOrderedInt
41
doJoin() doJoin()
NORMALCANCELLEDSIGNAL
EXCEPTIONAL
q
CancellationException
doJoin()
private int doJoin() {
Thread t; ForkJoinWorkerThread w; int s; boolean completed;
if ((t = Thread.currentThread()) instanceof ForkJoinWorkerThread) {
if ((s = status) < 0)
return s;
if ((w = (ForkJoinWorkerThread)t).unpushTask(this)) {
try {
completed = exec();
} catch (Throwable rex) {
return setExceptionalCompletion(rex);
}
if (completed)
return setCompletion(NORMAL);
}
return w.joinTask(this);
}
else
return externalAwaitDone();
}
doJoin()
NORMAL EXCEPTIONAL
1.6
Java
42
Java
Java JVM
CPU Java JVM CPU
Java
1.7 Volatile
synchronized Volatile Volatile
synchronized
synchronized
Inter Volatile
Volatile
1.7.1
1-2
memory barriers
cache line
atomic operations
L1L2L3
cache hit
write hit
43
1.7.2 Volatile
Java volatile java
Java
volatile volatilejava
1.7.3 Volatile
Volatile synchronized
1.7.4Volatile
Volatile x86 JIT
Volatile CPU
Java
instance = new Singleton();//instance volatile
lock
addl $00,(%esp);
volatile IA-32
lock
1)
2) CPU
L1,L2 Volatile
44
JVM Lock
IA-32
Lock Lock
LOCK# LOCK#
CPU
LOCK
8.1.4 Intel486 Pentium
LOCK# P6
LOCK#
IA-32 Intel 64
MESI
IA-32 Intel 64
Pentium P6 family
1.7.5Volatile
Java Doug lea JDK7
LinkedTransferQueue Volatile
45
PaddedAtomicReference(T r) {
super(r);
//
LinkedTransferQueue
Headtail PaddedAtomicReference AtomicReference
64 4
15 60 Value 64 64
i7 Atom NetBurst Core Solo
Pentium M L1L2 L3 64
64
46
Doug lea 64
Volatile 64
64 P6 L1 L2
32
1.8 Synchronized
Synchronized
Java SE1.6 Synchronized
Java SE1.6
1.8.1
Java
q
q Class
q Synchonized
1.8.2
JVM JVM Monitor
monitorenter monitorexit
JVM
monitorenter monitorexit
47
1.8.3 Java
Java 3 Word
2 32 32bit
1-2
1-3
32/64bit
Mark Word
hashCode
32/64bit
32/32bit
Array length
25 bit
4bit
1bit
2bit
hashCode
01
23bit
4bit
2bit
48
1bit
2bit
00
10
GC
11
ID
Epoch
01
25bit
31bit
unused
ThreadID(54bit)
1bit
4bit
1bit
2bit
cms_free
01
01
hashCode
Epoch(2bit)
1.8.4
Java SE1.6
Java SE1.6
1.8.5
Hotspot
ID
CAS Mark Word
49
Mark Word
1 CAS
CAS
Mark Word
1
2
50
1-9
Java 6 Java 7
JVM -XXBiasedLockingStartupDelay = 0
JVM
-XX:-UseBiasedLocking=false
51
1.8.6
JVM
52
1-10
CPU
1.8.7
1-7
CPU
CPU
1.8.8 6
HotSpot markOop.hpp biasedLocking.cpp
ObjectMonitor.cpp BasicLock.cpp
1.9
atomicatomic operation
Inter Java
1.9.1
1-8
53
Cache line
CAS
CPU
CPU pipeline
CPU
CPU CPU
1.9.2
32 IA-32
1.9.3
6 16/32/64
54
1.9.4
i++
i=1, i++ 3 2
1-11
i
CPU1
CPU2
LOCK
,
55
1.9.5
CPU
L1L2 L3
6
LOCK
LOCK
1 CPU1 i CPU2 i
cache line
Inter486 ,
Inter LOCK
BTSBTRBTC XADDCMPXCHG
ADDOR
1.9.6Java
Java CAS
1.9.7 CAS
JVM CAS CMPXCHG
56
private int i = 0;
@Override
cas.count();
cas.safeCount();
});
ts.add(t);
t.start();
57
//
try {
t.join();
} catch (InterruptedException e) {
e.printStackTrace();
System.out.println(cas.i);
System.out.println(cas.atomicI.get());
System.out.println(System.currentTimeMillis() - start);
/**
* CAS
*/
for (;;) {
int i = atomicI.get();
if (suc) {
break;
58
/**
*/
i++;
expectedReference,//
59
newReference,//
int
expectedStamp, //
int
newStamp //
CAS CPU
JVM pause pause
de-pipeline, CPU
CAS
CAS
1.9.8
JVM
JVM CAS
CAS
CAS
1.10
VolatileSynchronized Java
Volatile
60