Java内存模型JMM学习之上下文切换-多线程一定快吗?

写在前面:本系列博客主要记录自己的学习过程,回顾JMM相关的东西,主要参考《java并发编程的艺术》,这本书粗略的看了两遍,但是里面很多东西很模糊,决定再重新捋一遍,理解了才是自己的。

一个概念

时间片:Cpu分配给各个线程的时间(非常短)。

多线程怎么工作?

       就算是单核处理器也支持多线程,cpu通过给每个线程分配时间片来实现这个机制。,cpu通过不断的切换线程执行,由于比较快,所以我们感觉多个线程是同时执行。

带来性能的影响

上线文切换会影响线程执行的速度。

一个问题,多线程一定快吗?

经过测试给出的答案是:不一定。当并发执行累加操作不超过百万次的时候,速度会比串行执行累加操作要慢。因为线程创建存在一个上线文切换的开销。

如何减少上下文开销?

无锁并发编程,CAS算法,使用最少线程和使用协程。

无锁并发编程:开发用一些方法避免使用锁,使用特定的算法,不同的线程处理不同的数据

CAS:Java包使用CAS算法,一种基于乐观锁的算法,javaAutomic包使用了CAS算法更新数据,不需要加锁。

使用最少线程:避免创建不需要的线程,比如任务很少,但是创建了很多线程来处理,这样会造成大量线程都处于等待状态。

协程:单线程里实现任务的调度,并在单线程里维持多个任务间的切换。

资源限制的考虑:程序的执行顺序受限于计算机硬件资源或者软件资源。

 

      并发执行代码执行的速度和加快的原则将代码中串行执行的部分变成并发执行,受限于资源,仍然在串行执行(个人理解,多个线程并发执行资源就一个,比如一个管道,他们同时处理,可以把同时处理看成一个串行的)由于资源限制,这种运行速度肯定变慢,反倒不如单线程执行的快了,严重的时候cpu利用率会达到100%,会导致很长时间不能完成任务。改成单线程一个小时就好了。

如何解决?

硬件方面

集群!比如使用ODPS,Hadoop或者自己搭建的集群,不同的机器处理不同的数据。

软件方面

    资源复用。比如使用连接池,Socket连接复用或者调用对方webService接口获取数据时只建立一个连接(个人理解也就是短连接)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值