Synchronized关键字
- 修饰static方法为类锁,修饰普通方法为对象锁。
- 如果传入为this为对象锁,如果传入为 *.class为类锁。
- 对象锁只有为同一个对象的时候才生效,类锁为同一个类的时候才生效。但是类锁和对象锁互不影响。
- 对象在内存中的布局:对象头、实例数据、对齐填充
线程池
- 线程池的父级接口:Executor
- 五种常用线程池的工具创建类:Excutors
- 真正的创建类为ThreadPoolExecutor
- newFixedThreadPool
corePoolSize = n
maximumPoolSize = n
KeepAliveTime = 0L
workQueue = LinkedBlockQueue
特点为固定线程池大小,缺点线程较多的时候会导致队列等待线程较多,造成OOM
- newCacheThreadPool
corePoolSize = 0
maximumPoolSize = Integer.MAX_VALUE
keepAliveTime = 60L
unit = SECOND
workQueue = SynchronousQueue
特点为线程池可动态扩展,当线程池的线程不够的时候,会创建线程,当空闲线程超过时间的时候,会回收线程。 缺点:最大线程数量为Interger.MAX_VALUS,运行线程过多的时候会OOM
- newScheduledThreadPool
特点为创建一个定长线程池,支持定时及周期性任务执行。 - newSingleThreadExecutor
单线程线程池,单线程执行,保证按一定的顺序执行(FIFO 、LIFO 、以及优先级) - 等待队列包括:ArrayBlockQueue、LinkedBlockQueue、SynchronousQueue、PriorityBlockQueue
- 四种饱和策略:指当限定的队列已达饱和状态,并且指定的线程都已开启。
AbortPolicy : 拒绝所有服务,直接抛异常
CallerRunsPolicy : 只用调用者所在的线程来执行任务
DiscardPolicy : 不处理,直接丢弃掉任务
DiscardOldestPolicy : 丢弃掉阻塞队列中存放时间最久的任务,执行当前任务