多线程总结 容器 Map/Set 不需要同步的时候可以选择 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的使用示例