- 不需要同步的时候可以选择 HashMap
- 不需要同步,需要排序可以选择 TreeMap
- 不需要同步,且需要双向队列或者栈的可选择 LinkedHashMap
- 同步,并发量小可以选择 HashTable Collections.sychronizedXXX
- 并发量大,可选择 ConcurrentHashMap
- 在5的前提下,需要排序 ConcurrentSkipListMap
- 不需要同步,可以选择 ArrayList LinkedList
- 并发量小,可选择 Collections.synchroizedXXX CopyOnWriteList(适合大量读,少量写)
- 并发量大,可选择 ConcurrentLinkedQueue BlockingQueue(无界阻塞式队列) ArrayBQ(有界) TransferBQ(直接转给消费者) DelayQueue(执行定时任务)
- Executor
- ExecutorService
- Callable
- Future
- 6种线程池
- newFixedThreadPool(固定线程池)
- newCachedThreadPool(带有缓存线程池,默认空闲线程60s)
- newSingleThreadExecutor(单个线程)
- newScheduledThreadPoold(定时线程池)
- newWorkStealingPool(空闲线程去抢占其他线程的任务队列的任务)
- ForkJoinPool(适合大规模计算)
- synchronized加锁
- 加锁与不加锁的区别
- 产生脏读问题
- 同步和非同步方法是否可以同时使用
- synchronized是可重入锁
- 异常释放锁
- volatile
- volatile并不能保证的多线程的一致性
- 锁粒度
- 锁对象变了,锁就被释放了
- 不要以字符串常量作为锁定对象
- 线程通信
- ReentrantLock
- trylock
- ReentrantLock的公平锁
- 生产者消费者
- 用lock和condition进行生产者和消费者
- ThreadLocal
- 单例,内部类方式,不需要加锁
- 售票程序
- ConcurrentMap
- 利用容器LinkedBlockingQueue生产者消费者
- 线程池-newFixedThreadPool
- future
- 并行计算的小例子
- newCachedThreadPool
- newSingleThreadExecutor
- newScheduledThreadPool
- WorkStealingPool
- ForkJoinPool
- parallel的小例子
- 死锁的模拟
- Semaphore例子
- CountDownLatch例子
- CyclicBarrier的使用示例