关于线程池和多线程同步的一点问题记录
1.线程池
newScheduledThreadPool可以设定预定工作时间,给定延迟的线程池
newFixedThreadPool每提交一个任务就创建一个新的工作线程,如果工作线程数量达到设定的最大值就把任务存入到池队列中
newCachedThreadPool创建一个可以根据需要创建新线程的线程池,可重用时就重用,没线程可用就新建,移除长时间不用的线程
newSingleThreadExecutor创建一个只有一个大小的线程池
这里的所有线程池都有一个核心线程数(single只有一个核心线程),一般来说核心线程数以内的线程不会在没有任务的时候被释放,但是这个也可以配置为容许核心线程被释放
2.volatile变量
volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。而且成员变量发生变化时,强迫线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。volatile仍然不能保证原子性,因此仍然有可能导致数据不同步的问题。使用场景为多个线程共享同一个数据,static和volatile的区别在于static修改之后不能保证立即回写到主内存而volatile会在修改完之后立即回写主内存。与synchronized的区别在于后者能保证原子性。保证原子性可以使用原子更新字段类 Atomic类三剑客。