关于java多线程的性能

吴冬冬
领域专家: 后端开发技术领域
2009-08-13 06:12:58
就性能方面我认为是 无阻塞(包括IO阻塞,同步阻塞等)就不要用多线程,不然比单线程还慢。
关于单核和多核的考虑 有些人可能认为 多核的情况下多线程能提高性能
但单线程在多核下就是用的单CPU吗?答案是非也,自己写个单线程在多核下运行试试就知道了

欢迎大家讨论
...全文
434 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
jinxfei 2009-08-14
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 lastsweetop 的回复:]
PS:而CPU需要复杂的元素按操作这种情况呢-----》而CPU需要复杂的运算操作这种情况呢

[/Quote]

阻塞就是因为速度不匹配引起的,涉及到I/O,必定有阻塞,这基本上是毫无疑问的,
除非有一种I/O能够和计算机的总线速度完全匹配。

你说“再例如CPU运算做生产者,IO操作作消费者的情况,这样也可能不会阻塞。 ”,
怎么可能,CPU每秒产生1000M数据,I/O怎么消费,怎么可能不阻塞,
只是这里阻塞的不是I/O,是把CPU阻塞了,
而这时候不用多线程,那么CPU的计算能力就白费了,只能屈尊到I/O的速度。

而另一方面,
无论CPU做多么复杂的处理动作,处理完以后,你必定要去I/O读取下一个数据,或者通过I/O存数据,
在这一刻,无论读/存数据花10MS还是1MS,
总之,这时候,CPU就是在等待,这就是阻塞。

怎么才能不阻塞呢?
那就是在CPU还正在处理的时候,就把数据读出来,
ok,这时候,其实就是多线程了,一个线程在运算,另一个线程在读数据。
jiaxiangw 2009-08-14
  • 打赏
  • 举报
回复
初学java好多都不懂,大家都是大虾啊
吴冬冬 2009-08-14
  • 打赏
  • 举报
回复
PS:而CPU需要复杂的元素按操作这种情况呢-----》而CPU需要复杂的运算操作这种情况呢
吴冬冬 2009-08-14
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 jinxfei 的回复:]
引用 10 楼 lastsweetop 的回复:
引用 7 楼 java2000_net 的回复:
错误的想法。我举一个简单的例子吧!
你要更新10个服务器的数据,你可以从1到10逐个更新,也可以同时开启10个线程(或者进程)进行更新。
请注意:影响系统速度的因素决定了多线程的效率。
在这个需求里,速度最慢的是网速和数据库的处理速度,所以此时开启多线程是有意义的。
当然,你可以认为什么非阻塞,但实际情况是,你的程序如果一直在内存里运行,不设及到任何IO操作,那么这个程序也就不需要跟外界进行任何操作,那么....


1.网速和数据库处理速度可能产生阻塞
2.不是涉及IO操作就一定阻塞

你好像没明白我的意思,或者你自己也不明白自己讲什么



楼主啊,只要涉及I/O基本上就存在阻塞,因为还没有哪个I/O的速度能够比上CPU。
所以,从CPU的角度来看,除了寄存器,其它的都是I/O,都是外设,
内存都不能例外。

所以老紫竹说的很对,在不讨论任何阻塞的情况下,讨论这个问题意义不大。

楼主啊,你再说说你讨论这个问题的意义吧,
因为如果不考虑阻塞的话,可能真的只剩下数数这件事儿可作了。


[/Quote]

IO操作一定阻塞的观点,我不赞同
IO确实比CPU慢很多,但只是从相同的处理量来说
如果IO只是读一条数据,而CPU需要复杂的元素按操作这种情况呢。
(考虑问题要全面,刘易斯跑百米是比我快,但他跑1000米,我跑100米呢,谁先到终点?)

所谓阻塞,我的理解就是供不应求。
再例如CPU运算做生产者,IO操作作消费者的情况,这样也可能不会阻塞。

humanity 2009-08-13
  • 打赏
  • 举报
回复
接分也还是有意义的。

如果按楼主的意思,我只能说各自有其生存的理由,既然没必要用那就表示它本来就不是为其而生的。因为不是所有的东西都只从技术方面去了解,很多时候我们是为了解决某类特定的问题而提出新的设想,甚至有些时候API里面都写下了设计约定(为了这样写而不那样写),而没有说这个设想/编程模型是万能的,你的想法我也赞成,比如像数数确实没必要用多线程,因为做这样简单的算术运算的时间猜测比较线程切换还要少吧(还从没观察过呢,不知道用什么工具观测)?
zx8813443 2009-08-13
  • 打赏
  • 举报
回复
刚看了一个没有什么意义的帖子
jinxfei 2009-08-13
  • 打赏
  • 举报
回复
如果所有人都不明白楼主的意思,呵呵。。。
jinxfei 2009-08-13
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 lastsweetop 的回复:]
引用 7 楼 java2000_net 的回复:
错误的想法。我举一个简单的例子吧!
你要更新10个服务器的数据,你可以从1到10逐个更新,也可以同时开启10个线程(或者进程)进行更新。
请注意:影响系统速度的因素决定了多线程的效率。
在这个需求里,速度最慢的是网速和数据库的处理速度,所以此时开启多线程是有意义的。
当然,你可以认为什么非阻塞,但实际情况是,你的程序如果一直在内存里运行,不设及到任何IO操作,那么这个程序也就不需要跟外界进行任何操作,那么....


1.网速和数据库处理速度可能产生阻塞
2.不是涉及IO操作就一定阻塞

你好像没明白我的意思,或者你自己也不明白自己讲什么
[/Quote]



楼主啊,只要涉及I/O基本上就存在阻塞,因为还没有哪个I/O的速度能够比上CPU。
所以,从CPU的角度来看,除了寄存器,其它的都是I/O,都是外设,
内存都不能例外。

所以老紫竹说的很对,在不讨论任何阻塞的情况下,讨论这个问题意义不大。

楼主啊,你再说说你讨论这个问题的意义吧,
因为如果不考虑阻塞的话,可能真的只剩下数数这件事儿可作了。

阿士匹灵 2009-08-13
  • 打赏
  • 举报
回复
高手讨论的问题

呵呵

线程的性能 效率
islandrabbit 2009-08-13
  • 打赏
  • 举报
回复
很好的学习机会,帮顶。
chenql175 2009-08-13
  • 打赏
  • 举报
回复
学习~~~
yanliang_xt 2009-08-13
  • 打赏
  • 举报
回复
学习了。。
吴冬冬 2009-08-13
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 java2000_net 的回复:]
错误的想法。我举一个简单的例子吧!
你要更新10个服务器的数据,你可以从1到10逐个更新,也可以同时开启10个线程(或者进程)进行更新。
请注意:影响系统速度的因素决定了多线程的效率。
在这个需求里,速度最慢的是网速和数据库的处理速度,所以此时开启多线程是有意义的。
当然,你可以认为什么非阻塞,但实际情况是,你的程序如果一直在内存里运行,不设及到任何IO操作,那么这个程序也就不需要跟外界进行任何操作,那么....

[/Quote]
1.网速和数据库处理速度可能产生阻塞
2.不是涉及IO操作就一定阻塞

你好像没明白我的意思,或者你自己也不明白自己讲什么
lixiaolong3399 2009-08-13
  • 打赏
  • 举报
回复
楼主只是希望,我们对这个话题提出自己的看法,, 但又希望我们肯定无阻塞不用多线程这个观点, 从这点来看, 楼主已经明白了这个点,, 程序本身就是有需要就使用, 没需要就不用使用。。 所以,决定多线程是否使用, 看的是自己要做什么。。 相信大家都明白。。。。 谢谢楼主的贴。
老紫竹 2009-08-13
  • 打赏
  • 举报
回复
我认为这个程序没有存在的必要。自杀算了。
老紫竹 2009-08-13
  • 打赏
  • 举报
回复
错误的想法。我举一个简单的例子吧!
你要更新10个服务器的数据,你可以从1到10逐个更新,也可以同时开启10个线程(或者进程)进行更新。
请注意:影响系统速度的因素决定了多线程的效率。
在这个需求里,速度最慢的是网速和数据库的处理速度,所以此时开启多线程是有意义的。
当然,你可以认为什么非阻塞,但实际情况是,你的程序如果一直在内存里运行,不设及到任何IO操作,那么这个程序也就不需要跟外界进行任何操作,那么....
铁匠梁老师 2009-08-13
  • 打赏
  • 举报
回复
学习了,东西都有适合的场景。
适合最好
吴冬冬 2009-08-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 jinxfei 的回复:]
无论是java还是什么,只要是有线程,就有调度开销,这是毋庸置疑的。

所以,仅仅讨论多线程的性能,感觉意义不大。

如果要从1数到100000000,那么单线程肯定比多线程快啊。

多线程,是干啥用的呢?
说白了,说到底,是为了简化编程模型。
[/Quote]
我说的重点是 无阻塞就不用多线程
多线程不仅是简化编程模型,在有阻塞产生时,多线程确实可以提高性能。
但是无阻塞时用多线程反而会降低性能。

很多业务需要多线程,这个大家都懂
希望大家下面的讨论只从性能方面考虑
jinxfei 2009-08-13
  • 打赏
  • 举报
回复
无论是java还是什么,只要是有线程,就有调度开销,这是毋庸置疑的。

所以,仅仅讨论多线程的性能,感觉意义不大。

如果要从1数到100000000,那么单线程肯定比多线程快啊。

多线程,是干啥用的呢?
说白了,说到底,是为了简化编程模型。
绿绦 2009-08-13
  • 打赏
  • 举报
回复
楼主所说

多核 运行单线程 的不同 在于结果不同 处理机制没有变化 CPU等待调度的时间不同了

多核运行 多线程 在cup调度的机制不同 结果也不同

这两者的不同 是不能平级看待


个人意见 绿绦工作室
加载更多回复(2)

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧