多线程的杂篇
thread的join方法是运行该方法的线程必须等到join方法的线程运行完毕才能让当前线程继续运行。原理是校验join线程是否存活,存活就一直循环等待,直到线程over了,才继续向下运行。
volitile 是让线程间进行通讯的,解决了编译器的重排序,是程序按照正常的执行流程运行,
jstat 命令监视虚拟机各种运行状态,包括垃圾收集,内存,类装载
jstat -gc pid 可以监视堆的各个分区内存信息
jstack :堆栈跟踪工具
自定义类加载器 需要重写findclass()
concurrenthashmap()的put操作是先进行hash找到分段,然后分段上加锁,在安全上和效率上是可以的。 并发情况下使用,不要使用hashmap
concurrentLinkedQueue 线程安全的队列,它的性能好于blockingqueue
java里的阻塞队列
arrayBlockingQueue: 数组结构的有界阻塞队列
linkedBlockingQueue: 链表结构组成的有界队列,linkedTransferQueue :一个由链表结构组成的无界阻塞队列,linkedBlockingDeque:链表组成的双向阻塞队列
Fork/join 框架(多线程):
目的是把一个大任务 进行拆分,每个子任务单独运行,任务在调用join方法获得该任务的结果,需要继承recursiveTask类,重写compute()方法
线程间交换数据的exchanger 可以用来校验2个线程操作处理同样的数据后是否是一致的。
控制并发线程数的semaphore:例如一条公路上只能有100辆车通行,其它的车只能在路口等待。
CyclicBarrier 和 CountDownLatch的区别:
CountDownLatch的计数器只能用1次,而CyclicBarrier 的计数器可以使用rest()方法重置,所以CyclicBarrier 能处理更为复杂的业务场景。