学了两天,总结一下。我感觉Java
concurrency的面试会涉及到两个部分,一是一般的多线程的概念和用法,另一个就是Java自己的concurrency
library了。前者一般在学校都接触过,后者根据我的观察好像精通的人并不算多,
搞Java的大多还是搞J2EE的。因此面试中碰到很可能主要是考察多线程一般性的概念和用法。但是在学习的过程中发现Java的library也挺有用的,可以简化多线程编程,因此两个就一起总结了。
Java多线程很需要经验的积累,如果工作不用,或者没有做过相关项目的话,也不太可能理解的很深入。像算法有很多的OJ可以练习,多线程就不知道怎么提高了,也是我需要下一步来探索的,如果谁有好的idea可以分享一下。
今天order了《Java Concurrency
in Practice
》,还没入手。因此主要是通过以下三本书来学习的。
CC150:
由于基础差,我对于很多知识和概念的理解都是从CC150开始的,比如DP。CC150里讲解了多线程的最基本的概念,包括Thread,
Runnable, synchronized, lock, semephore,
deadlock, dining
philospher,等等。
Thinking in
Java:感觉非常有用。洋洋洒洒写了差不多200页,让我怀疑是不是准备面试就不需要Java Concurrency
in
Practice了。基本上涵盖了多线程的方方面面了,虽然不一定介绍的详细。
Effective
Java:内容不多,看了Thinking in
Java之后没有什么特别的感觉。
下面是总结出来的一个提纲,我还需要在这个提纲下继续学习,也应该会持续更新提纲。
1. How to implement
thread
implement Runnable:
recommended
implement Callable: has
return value
extends Thread
2. How to create
and start thread
Executor(Thread pool):
recommended
Thread.start
Timer
以上内容理解起来都比较简单。其实如果多线程不共享资源,更确切的说不共享mutable资源的话,是谈不上复杂的。但是一旦涉及到共享mutable
variable以后,所有的复杂问题开始接踵而至了。这也是为什么functional
programming更适合并行运算的原因,因为FP最基本的特性就是immutability了,这一下就解决了多线程主要的复杂问题了。
3. Synchronization:因为share mutable variable就会产生race
condition的问题,因此我们就需要同步了。下面是几种同步方式。
synchronized keyword: instance method, class method, code
block
Lock
Semaphore
ReadWriteLock
CountDownLatch, CyclicBarrier etc.
因为同步编程比较难掌控,因此最好是能够回避同步。下面是一些avoid
synchronization的办法。
Immutability like FP
ThreadLocal
volatile
Atomic Wrapper: java.util.concurrent.atomic
concurrent collection
CocurrentHashMap
(HashMap)
CopyOnWriteArrayList
CopyOnWriteArraySet
ConcurrentLinkedQueue
(Queue)
ConcurrentSkipListMap (TreeMap)
ConcurrentSkipListSet
(TreeSet)
4. Communiication:除了同步,线程之间还需要通信和协作。下面是几种通信方式。
wait, notify, notifyAll
Condition
Semaphore: can be used both for lock and
signal (can avoid missed signal)
concurrent collection
BlockingQueue
5. Common problems and solutions
Race condition (synchronization)
Deadlock (lock ordering, lock
timeout, deadlock
detection)
Starvation (fairness)
6. Common coding questions
blocking queue
producer/consumer
read write lock
reentrant read write lock
dining philospher