Synchronized 和线程池篇

本文探讨了Java中的Synchronized关键字,详细解释了类锁和对象锁的区别以及内存布局。接着介绍了线程池的概念,讲解了Executor接口、常用线程池的创建类如ThreadPoolExecutor,分析了不同线程池如newFixedThreadPool、newCacheThreadPool的特点和潜在问题。同时提到了线程池的等待队列和饱和策略。

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 : 丢弃掉阻塞队列中存放时间最久的任务,执行当前任务

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值