| 编程中国 | 业界新闻 | 技术文章 | 视频教程 | 下载频道 | 程序源码 | 个人空间 | 编程论坛
全能ASP/PHP/ASP.NET主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付买域名,送MP3、MP4
高端软件开发 = 年薪十万不是梦赛孚耐:软件保护加密专家身份认证令牌USB KEY买空间,免费送域名(厦门中资源)
共有 207 人关注过本帖
标题:线程同步的小问题,是不是永远无法预知?
收藏  订阅  推荐  打印 
dousao
Rank: 3Rank: 3
等级:中级会员
帖子:194
积分:2102
注册:2007-11-8
线程同步的小问题,是不是永远无法预知?

public class TT implements Runnable {  
     int b = 100;  
      
     public synchronized void m1() throws Exception{  
           
         b = 1000;  
         Thread.sleep(5000);  
         System.out.println("b = " + b);  
     }  
      
     public synchronized void m2() throws Exception {  
         Thread.sleep(2500);  
         b = 2000;  
     }  
      
     public void run() {  
         try {  
             m1();  
         } catch(Exception e) {  
             e.printStackTrace();  
         }  
     }  
      
     public static void main(String[] args) throws Exception {  
         TT tt = new TT();  
         Thread t = new Thread(tt);  
      
         t.start();  
           
         tt.m2();  
         System.out.println(tt.b);  
     }  
}


是不是永远无法预知先执行主线程还是t线程? 当主线程执行调用m2时候m2睡眠不是把cpu让给了t线程了么?让来让去的也不清楚到底怎么让了,希望牛人解释先。
搜索更多相关主题的帖子: 线程  预知  
2008-9-16 18:42
dousao
Rank: 3Rank: 3
等级:中级会员
帖子:194
积分:2102
注册:2007-11-8

我的理解是这样的:

假设t线程先被分配执行,b=1000后,睡眠5000,机会让给主线程中的m2方法,m2睡眠2500,把锁给t线程,但是t线程还是在睡眠没法执行,只有等2500结束,主线程继续执行,b=2000,输出tt.b,即输出了2000,这个时候t线程终于有时间执行,接着从 Thread.sleep(5000);下面继续执行输出 b=2000


假设主线程先被分配执行,即执行m2,睡眠2500,让给t线程,b=1000,睡眠让给主线程m2,b=2000,t线程继续睡着,没法执行,所以主线程执行完,输出2000,然后t线程执行 输出b=2000

但是结果并非如此。我的理解哪里出问题了?
2008-9-16 18:57
dousao
Rank: 3Rank: 3
等级:中级会员
帖子:194
积分:2102
注册:2007-11-8

妈的,小破题目,难道难住众位好汉?
2008-9-17 00:13
oldmtn
Rank: 1
等级:新手上路
帖子:6
积分:162
注册:2008-9-22

你小子,再想想
2008-9-22 23:38
fvplayboy
Rank: 1
等级:新手上路
帖子:13
积分:244
注册:2008-9-21
``哎 `

真你M匪夷所思````我也整 不明白 ``我得出的结论是 2000    b=2000 高手指点指点啊``
2008-9-23 21:08
关于我们 | 广告合作 | 编程中国 | 清除Cookies | Archiver | WAP | TOP

编程中国 版权所有,并保留所有权利。鲁ICP备08000592号
Powered by Discuz, Processed in 0.050929 second(s), 9 queries.
Copyright©2004-2008, BCCN.NET, All Rights Reserved