网站建设与管理 孙伟,wordpress获取当前页地址,网站管理规范,黄页网站大全通俗易懂1、多线程并发
1#xff09;多线程中 synchronized 锁升级的原理是什么#xff1f;
synchronized 锁升级原理#xff1a;在锁对象的对象头里面有一个 threadid 字段#xff0c;在第一次访问的时候 threadid 为空#xff0c;jvm 让其持有偏向锁#xff0c;并将 threadid… 1、多线程并发
1多线程中 synchronized 锁升级的原理是什么
synchronized 锁升级原理在锁对象的对象头里面有一个 threadid 字段在第一次访问的时候 threadid 为空jvm 让其持有偏向锁并将 threadid 设置为其线程 id再次进入的时候会先判断 threadid 是否与其线程 id 一致如果一致则可以直接使用此对象如果不一致则升级偏向锁为 轻量级锁通过自旋循环一定次数来获取锁执行一定次数之后如果还没有正常获取到要使用的 对象此时就会把锁从轻量级升级为重量级锁此过程就构成了 synchronized 锁的升级。 锁的升级的目的锁升级是为了减低了锁带来的性能消耗。在 Java 6 之后优化 synchronized 的实现方 式使用了偏向锁升级为轻量级锁再升级到重量级锁的方式从而减低了锁带来的性能消耗。
偏向锁顾名思义它会偏向于第一个访问锁的线程如果在运行过程中同步锁只有一个线程访 问不存在多线程争用的情况则线程是不需要触发同步的减少加锁解锁的一些CAS操作比 如等待队列的一些CAS操作这种情况下就会给线程加一个偏向锁。 如果在运行过程中遇 到了其他线程抢占锁则持有偏向锁的线程会被挂起JVM会消除它身上的偏向锁将锁恢复到标 准的轻量级锁。
轻量级锁是由偏向所升级来的偏向锁运行在一个线程进入同步块的情况下当第二个线程加入锁 争用的时候轻量级锁就会升级为重量级锁
重量级锁是synchronized 是 Java 虚拟机中最为基础的锁实现。在这种状态下Java 虚拟机会阻 塞加锁失败的线程并且在目标锁被释放的时候唤醒这些线程。 2、线程池有什么优点
降低资源消耗重用存在的线程减少对象创建销毁的开销。
提高响应速度可有效的控制最大并发线程数提高系统资源的使用率同时避免过多资源竞争 避免堵塞。当任务到达时任务可以不需要的等到线程创建就能立即执行。
提高线程的可管理性线程是稀缺资源如果无限制的创建不仅会消耗系统资源还会降低系统 的稳定性使用线程池可以进行统一的分配调优和监控。
附加功能提供定时执行、定期执行、单线程、并发数控制等功能。 3、ThreadPoolExecutor饱和策略有哪些
如果当前同时运行的线程数量达到最大线程数量并且队列也已经被放满了任时ThreadPoolTaskExecutor 定 义一些策略:
ThreadPoolExecutor.AbortPolicy抛出 RejectedExecutionException来拒绝新任务的处理。
ThreadPoolExecutor.CallerRunsPolicy调用执行自己的线程运行任务。您不会任务请求。但是 这种策略会降低对于新任务提交速度影响程序的整体性能。另外这个策略喜欢增加队列容量。 如果您的应用程序可以承受此延迟并且你不能任务丢弃任何一个任务请求的话你可以选择这个策 略
(当前线程调用线程池处理多线程任务线程池队列满了那么就会用当前调用多线程的线程即用户线程来执行当前需要执行的多线程任务影响性能但是不会丢失任务)
ThreadPoolExecutor.DiscardPolicy不处理新任务直接丢弃掉。 ThreadPoolExecutor.DiscardOldestPolicy 此策略将丢弃最早的未处理的任务请求。 4、ThreadPoolExecutor线程池的执行原理 5、如何合理分配线程池大小?
要合理的分配线程池的大小要根据实际情况来定
简单的来说的话就是根据CPU密集和IO密集来 分配
什么是CPU密集 CPU密集的意思是该任务需要大量的运算而没有阻塞CPU一直全速运行。 CPU密集任务只有在真正的多核CPU上才可能得到加速(通过多线程)而在单核CPU上无论你开 几个模拟的多线程该任务都不可能得到加速因为CPU总的运算能力就那样。
什么是IO密集 IO密集型即该任务需要大量的IO即大量的阻塞。在单线程上运行IO密集型的任务会导致浪费 大量的CPU运算能力浪费在等待。所以在IO密集型任务中使用多线程可以大大的加速程序运行 即时在单核CPU上这种加速主要就是利用了被浪费掉的阻塞时间。
分配CPU和IO密集 1. CPU密集型时任务可以少配置线程数大概和机器的cpu核数相当这样可以使得每个线程都在 执行任务 2. IO密集型时大部分线程都阻塞故需要多配置线程数2*cpu核数 精确来说的话的话
从以下几个角度分析任务的特性 任务的性质CPU密集型任务、IO密集型任务、混合型任务。 任务的优先级高、中、低。 任务的执行时间长、中、短。 任务的依赖性是否依赖其他系统资源如数据库连接等。
可以得出一个结论 线程等待时间比CPU执行时间比例越高需要越多线程。 线程CPU执行时间比等待时间比例越高需要越少线程。