A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Neverbelazy 中级黑马   /  2013-5-17 11:29  /  2190 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 Neverbelazy 于 2013-5-19 11:03 编辑

看多线程的时候, 思考了一个关于为什么多线程会降低运行效率的问题, 欢迎大家讨论!

同步的使用是否会改变CPU的执行权? 如果同步不能干预到CPU, 那么是否可以认为对一个同步代码操作的线程越多,执行效率越低?

17:32 5/17更新
-------------------------------------- 个人的理解 ------------------------------------

1. CPU分配执行权, JVM虚拟机只能一定程度地干预 Java线程间的协作
2. 同步的原理是上锁, 上锁的目的是为了其他线程运行到此段代码处 无法继续运行, 但是CPU还是可以给其他线程分配运行权
3. 所以 假设3个线程,运行到同步代码块时, 一个先进去了,另外两个进不去, 但是CPU执行权还是在3个线程中分配, 假设CPU平均分配这就相当于一段时间内只有1/3的时间是有效运行,其它时段都在判断锁, 上锁,进不去。
4. 所以这样试想一下, 如果有n个线程, 那么有效的运行效率就只是 1/n.

那么, 有会引出一个问题, CPU可能分配的最小单步执行是什么? 如何提高同步时代码运行效率? 毕老师买票的程序是否可以被改进而使运行效率提高?

5/19日更新(没有新回复, 最近又有了些思考,重新编辑在此处作为感言)
----------------------------------------下面的参考,作为感言 --------------------------------------

1. CPU最小执行不是一条语句, 因为一条语句往往也是多步执行, 比如System.out.println(x.getName()+" "+x.getAddress()); 更比如 i++; 也是两步执行, CPU的最小执行是原子操作(细节暂时太了解)
2. 基于 上面提到的, 买票的例子出现数据错乱是在最后的一次买票(如果不巧此时所有窗口线程同事挂起,则最后出现负数票),一种提高效率的方法是在买票程序中加一个flag, flag监测 比如剩10张票了(10>窗口数,), 此时再进入有同步的代码块,这样就节省了同步的次数(懒汉单例设计模式为提高效率,最后在同步代码块外加的一步判断不也是这样吗)
3. 其实,仔细想下,线程冻结的机制也是可以节省同步时CPU运行效率的,因为冻结了的线程就不参与CPU执行权的分配了

4 个回复

倒序浏览
多线程是由java虚拟机调度的,如果一个程序里线程启的多了,调度的时间就会多,所以效率会有点影响。
回复 使用道具 举报
黑马云青年  个人感觉如果同步越多的话,线程之间的转换可能也会耗掉时间

评分

参与人数 1黑马币 +2 收起 理由
袁梦希 + 2

查看全部评分

回复 使用道具 举报
To 金牌黑马 2013-5-17 19:25:23
板凳

回帖奖励 +2

黑马云青年:楼上正解!
回复 使用道具 举报
如果问题已解决请再次编辑,改为以解决,方便大家看帖,没有就继续追问
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马