并发编程理论基础——合适的线程数量和安全的局部变量(十)

多线程的提升方向

  1. 主要方向在于优化算法和将硬件的性能发挥到极致
  2. 想要发挥出更多的硬件性能,最主要的就是提升I/O的利用率和CPU的利用率以及综合利用率
  3. 操作系统已经解决了磁盘和网卡的利用率问题,利用中断机制还能避免 CPU 轮询 I/O 状态,也提升了 CPU 的利用率。但是操作系统解决硬件利用率问题的对象往往是单一的硬件设备,而我们的并发程序,往往需要 CPU 和 I/O 设备相互配合工作,也就是说,我们还需要解决 CPU 和 I/O 设备综合利用率的问题。
  4. 如果 CPU 和 I/O 设备的利用率都很低,那么可以尝试通过增加线程来提高吞吐量。

创建多少线程数合适

  1. 我们的程序一般都是CPU和I/O操作交互执行的,其中I/O设备的速度要比CPU慢的多,所以I/O操作时间也要比CPU操作时间长的多,这种情况被称为I/O密集型计算
    • 最佳的线程数是与程序中 CPU 计算和 I/O 操作的耗时比相关的
    • (单核)最佳线程数 =1 +(I/O 耗时 / CPU 耗时)
    • (多核)最佳线程数 =CPU 核数 * [ 1 +(I/O 耗时 / CPU 耗时)]
  2. 还有一个与之相对的被称为CPU密集型计算,大部分场景下都是纯CPU计算
    • 对于 CPU 密集型的计算场景,理论上“线程的数量 =CPU 核数”就是最合适的
    • 不过在工程上,线程的数量一般会设置为“CPU 核数 +1”,这样的话,当线程因为偶尔的内存页失效或其他原因导致阻塞时,这个额外的线程可以顶上,从而保证 CPU 的利用率。

注意:工作中都是按照逻辑核数来的,理论值和经验值仅供参考,实际上还是要靠压测

方法是怎么执行的

当你调用一个方法时,CPU 要先找到方法的地址,然后跳转到这个地址去执行代码,最后 CPU 执行完方法后返回。

CPU 去哪里找到调用方法的参数和返回地址以及局部变量

  1. 通过 CPU 的堆栈寄存器,CPU支持的栈结构被称为调用栈
  2. 每个方法在调用栈里都有自己的独立空间,称为栈帧,每个栈帧里都有对应方法需要的参数和返回地址以及局部变量。当调用方法时,会创建新的栈帧,并压入调用栈;当方法返回时,对应的栈帧就会被自动弹出。也就是说,栈帧和方法是同生共死的。
  3. 调用栈和线程之间是什么关系:每个线程都有自己独立的调用栈
  4. 局部变量的作用域是方法内部,也就是说当方法执行完,局部变量就没用了

Java 方法里面的局部变量是否存在并发问题

没有。因为每个线程都有自己的调用栈,局部变量保存在线程各自的调用栈里面,不会共享,所以自然也就没有并发问题。

 

 

  • 12
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值