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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马19我最牛 中级黑马   /  2013-4-1 20:26  /  1751 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 许兵兵 于 2013-4-1 21:21 编辑
  1. class test implements Runnable
  2. {
  3.         private int x=0;
  4.         Object obj=new Object();   
  5.         public void run()      //重写RUN方法
  6.         {        
  7.                 while (x<100)   
  8.                         {
  9.                                 synchronized(obj)  //锁线程
  10.                                         {               
  11.                                                 System.out.println(Thread.currentThread().getName()+"-------"+x++)        ;//打印线程名  和X,
  12.                                         }
  13.                         }                        
  14.         }
  15.         
  16. }
  17. class  Dome
  18. {
  19.         public static void main(String[] args)
  20.         {
  21.                 test a1=new test();   //新建Test对象
  22.                 Thread b1=new Thread(a1);  //新建四个线程
  23.                 Thread b2=new Thread(a1);
  24.                 Thread b3=new Thread(a1);
  25.                 Thread b4=new Thread(a1);
  26.                 b1.start();                                        //启动四个线程
  27.                 b2.start();
  28.                 b3.start();
  29.                 b4.start();
  30.                
  31.                 /*
  32.                 for (int x=0;x<100 ;x++ )
  33.                         {
  34.                                 System.out.println("x="+x);
  35.                         }
  36.                 */
  37.         }

  38. }
复制代码
帮我看看,我就感觉我的程序很有规律,每次最后都是到102,按道理应该到99才对啊,为什么多了三个啊!
然后线程也一直都抢不到,也不知道是真的抢不到,还是说程序有问题,反正就是说线程从0到99一直都是一个线程,就是最后三个不是.测试了好多遍了,都不行!

未命名.jpg (27.55 KB, 下载次数: 16)

未命名.jpg

评分

参与人数 1技术分 +1 收起 理由
张熙韬 + 1

查看全部评分

8 个回复

倒序浏览

点评

.....不太对,为什么?应该是什么?大哥,帮我看看!  发表于 2013-4-1 20:40
回复 使用道具 举报
我上面已经帮你改了。。。。
  1. class test implements Runnable {
  2.         private int x = 0;
  3.         Object obj = new Object();

  4.         public void run() // 重写RUN方法
  5.         {
  6.                 synchronized (obj) // 锁线程
  7.                 {
  8.                         while (x < 100) {

  9.                                 System.out.println(Thread.currentThread().getName() + "-------"
  10.                                                 + x++);// 打印线程名 和X,
  11.                         }
  12.                 }
  13.         }

  14. }

  15. public class Dome {
  16.         public static void main(String[] args) {
  17.                 test a1 = new test(); // 新建Test对象
  18.                 Thread b1 = new Thread(a1); // 新建四个线程
  19.                 Thread b2 = new Thread(a1);
  20.                 Thread b3 = new Thread(a1);
  21.                 Thread b4 = new Thread(a1);
  22.                 b1.start(); // 启动四个线程
  23.                 b2.start();
  24.                 b3.start();
  25.                 b4.start();

  26.                 /*
  27.                  * for (int x=0;x<100 ;x++ ) { System.out.println("x="+x); }
  28.                  */
  29.         }

  30. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
张熙韬 + 1

查看全部评分

回复 使用道具 举报
在同步代码里面加上一个 if(x<100)来判断一下就好了.
类似于单例设计模式的懒汉式那样..
回复 使用道具 举报
public void run()      //重写RUN方法
        {       while(true){
                synchronized (obj) // 锁线程
                {
                        if(x < 100) {

                                System.out.println(Thread.currentThread().getName() + "-------"
                                                + x++);// 打印线程名 和X,
               
                        }
                       else
                       {
                             return;
                      }
                }
        }     

把循环放到同步外面,判断放到同步里面就行。

评分

参与人数 1技术分 +1 收起 理由
张熙韬 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 杨明宁 于 2013-4-1 21:16 编辑
  1. //把你的代码稍稍改动如下就可以了

  2. class test implements Runnable
  3. {
  4.         private int x=0;
  5.         Object obj=new Object();   
  6.         public void run()      //重写RUN方法
  7.         {        
  8.                 while (true)
  9.                         {
  10.                                 synchronized(obj)  //锁线程
  11.                                         {  
  12.                                                                                         if (x < 100)//这里加多一个if判断就没问题了
  13.                                                                                         {
  14.                                                 System.out.println(Thread.currentThread().getName()+"-------"+x++)        ;//打印线程名  和X,
  15.                                                                                         }
  16.                                         }
  17.                         }                        
  18.         }
  19.         
  20. }
  21. class  Dome
  22. {
  23.         public static void main(String[] args)
  24.         {
  25.                 test a1=new test();   //新建Test对象
  26.                 Thread b1=new Thread(a1);  //新建四个线程
  27.                 Thread b2=new Thread(a1);
  28.                 Thread b3=new Thread(a1);
  29.                 Thread b4=new Thread(a1);
  30.                 b1.start();                                        //启动四个线程
  31.                 b2.start();
  32.                 b3.start();
  33.                 b4.start();
  34.                
  35.                 /*
  36.                 for (int x=0;x<100 ;x++ )
  37.                         {
  38.                                 System.out.println("x="+x);
  39.                         }
  40.                 */
  41.         }

  42. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
张熙韬 + 1

查看全部评分

回复 使用道具 举报
黄小贝 发表于 2013-4-1 20:43
我上面已经帮你改了。。。。

你这样改的话,不就是相当于,第一个线程谁先进去,然后就一次性循环完,然后才能解锁码?那跟单线程有什么区别!

点评

是的,我瞎了,当我没出现过  发表于 2013-4-1 22:54
回复 使用道具 举报
万蕾 发表于 2013-4-1 21:02
public void run()      //重写RUN方法
        {       while(true){
                synchronized (obj ...

豁然开朗!
回复 使用道具 举报
李尧 发表于 2013-4-1 20:51
在同步代码里面加上一个 if(x

OK,明白了!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马