×

java多线程应用场景 线程 java

java多线程应用场景(java多线程如何实现在多CPU上分布)

admin admin 发表于2023-10-28 16:38:52 浏览42 评论0

抢沙发发表评论

本文目录

java多线程如何实现在多CPU上分布

一个JAVA线程就是一个OS线程,线程调度依赖于操作系统,JVM层面不干预。

JAVA语言层面讲,只是规范,并不要求具体如何实现。具体的实现模型有几种,比如1:1,N:1, 1:N,具体怎么选,JVM厂商自己的事儿。

在LINUX下,你可以用JNI来调用taskset,实现把线程分配到某一个CPU上。但是这么做的理由我现在还想不出来。

如何深入Java多线程开发

JAVA多线程技术太杂,随着了jdk版本的逐渐迭代,越来越多的多线程技术被提出来,原本的还没掌握又来了新的技术,但是万变不离其宗,下面来看下多线程主要涉及哪些东西?

1,何为多线程?在计算机系统中,CPU负责计算,而内存负责数据存储,线程就是操作系统用来进行运算调度的最小单位!显然,多线程就是多个调度单位!

2,为什么要使用多线程?

①,针对单核CPU,CPU在同一时间只能和一个线程进行交互,如果这个线程因为某些原因出现阻塞,那么整个计算机就处于停滞状态,为了避免这一现象,线程被设计为多线程执行模式,如果一个线程阻塞了,另外的线程可以继续使用执行计算,这样CPU使用效率就得到了极大的提升!

②,多核CPU:现在的计算机都被设计为多核的,能保证同一时间可以有多个运算单元,如果多核CPU却只使用单线程,无疑更是极大的浪费了CPU资源!

多线程的使用在很多场景中(批量处理,并行计算等)有着极高的效率,所以使用多线程无疑是很重要的!

3,JAVA中的多线程:JAVA中的线程与操作系统的线程不是一个概念虽然都有相似的几个线程状态(new,runnable,running,block,waiting,dead),JVM只是操作系统中的一个进程,JAVA的多线程只是属于jvm中的调度单元,具体关系常见如下解释:

多个线程可以读一个变量,只有一个线程可以对这个变量进行写,到底要不要加锁

先说结论:不必要

  • 如果不需要可见性,什么都不需要加
  • 如果需要保证可见性,则需要加volatile关键字。这里可以加锁,但是没必要,对性能有影响

下面简单解释下原因:

加锁是因为操作不是原子性的,以i++这个操作来解释,看下面两张图。

i++这个操作需要

  • 先将i的值从内存中读出来
  • 然后加1
  • 最后写回去

看上面第二张图,能很清楚的理解流程吧?

加锁就是保证上面的三步是一个原子操作。

回到问题,这里只有一个线程写,实际没有竞争,所以没必要加锁。

但是,看第一张图,因为有主内存和本地内存的存在

  • 线程先写入本地内存
  • 然后刷入主内存
  • 其它内存同步主内存到工作内存
  • 然后从工作内存中读取

一个线程写入后,不能保证其它线程立即看到,这就是可见性问题。

加了volatile关键字后,会强制操作后同步工作内存和主内存,保证其它线程立刻看到。