qq_25973937 2016-05-19 11:19 采纳率: 50%
浏览 1235
已采纳

java多线程问题 求各位大神帮忙看下

就是要创建100个线程,每个线程都对sum值进行加一,如果我注释掉sleep(1);的话就会输出0 没有注释掉就会正常输出1-100请问 这是为什么啊?谢谢。

public class test1 {
private static int sum=0;
private static Object obj=new Object();
public static void main(String[] args) throws InterruptedException {
for(int i=0;i<100;i++){
synchronized(obj){
myThread mythread=new myThread(sum);
mythread.start();
Thread.sleep(1);
sum=mythread.getSum();
System.out.println(sum);
}
}
}
}
class myThread extends Thread{
public int sum;
public myThread(int sum){
this.sum=sum;
}
public void run(){
synchronized(this){
sum++;
}
}
public int getSum(){
return sum;
}
}


  • 写回答

1条回答 默认 最新

  • Grindstone_Fos 2016-05-19 11:55
    关注

    以下皆是愚见:

    首先,synchronized(obj)这个锁感觉没什么必要,因为就只有主线程才有可能进到这个锁内部。

    进入正题。

                    myThread mythread=new myThread(sum);//新建一个工作线程
                    mythread.start();//启动工作线程
                    Thread.sleep(1);//主线程休眠1毫秒(堵塞)
                    sum=mythread.getSum();//把工作线程中的sum的值赋给主线程中的sum
                    System.out.println(sum);//输出sum
    

    当 Thread.sleep(1);没有注释时,sum的变换:

     //主sum=0;
    myThread mythread=new myThread(sum);//新建一个工作线程
    //主sum=0;工sum=0;
    mythread.start();//启动工作线程
    //主sum=0;工sum=0;
    Thread.sleep(1);//主线程休眠1毫秒(堵塞)
    //主sum=0;工sum=1(工作可能已经执行了run()方法了)
    sum=mythread.getSum();//把工作线程中的sum的值赋给主线程中的sum
    //主sum=1;工sum=1;
    System.out.println(sum);//输出主sum=1
    

    自己for循环思考一下。

    当 Thread.sleep(1);注释时,sum的变换:

     //主sum=0;
    myThread mythread=new myThread(sum);//新建一个工作线程
    //主sum=0;工sum=0;
    mythread.start();//启动工作线程
    //主sum=0;工sum=0;
    //Thread.sleep(1);//主线程休眠1毫秒(堵塞)
    //主sum=0;工sum=0(工作线程还没来得及执行run()方法)
    sum=mythread.getSum();//把工作线程中的sum的值赋给主线程中的sum
    //主sum=0;工sum=0或1;(工作线程可能执行完run()方法了)
    System.out.println(sum);//输出主sum=0
    

    自己for循环思考一下。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 AT89C51控制8位八段数码管显示时钟。
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 下图接收小电路,谁知道原理
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题