黑马程序员技术交流社区

标题: 为什么这个程序用了同步代码块之后还是会输出负数呢 [打印本页]

作者: zsq8210366    时间: 2016-11-23 08:29
标题: 为什么这个程序用了同步代码块之后还是会输出负数呢
[Java] 纯文本查看 复制代码
public class Test5 {

        public static void main(String[] args) {
                MyRunnable mr =new MyRunnable();
                Thread t1 = new Thread(mr,"A");
                Thread t2 = new Thread(mr,"B");
                Thread t3 = new Thread(mr,"C");
                t1.start();
                t2.start();
                t3.start();
        }

}

class MyRunnable implements Runnable{
        private static int sum =1;
        @Override
        public  void run() {
                while(sum<=100){
                        synchronized (MyRunnable.class) {
                                try {
                                        Thread.sleep(100);
                                } catch (InterruptedException e) {
                                       
                                        e.printStackTrace();
                                }
                                if(sum ==100){
                                        System.out.println(Thread.currentThread().getName()+"老师发了第"+sum+"份试卷,试卷分发完毕");
                                }else{
                                        System.out.println(Thread.currentThread().getName()+"老师发了第"+sum+"份试卷,还剩"+(100-sum)+"份试卷");
                                }
                                sum++;
                        }
               
                }
        }
       
}


输出结果到最后会有负数,像这样子
A老师发了第100份试卷,试卷分发完毕
C老师发了第101份试卷,还剩-1份试卷
B老师发了第102份试卷,还剩-2份试卷

这是为什么,求大神指点一下

作者: zhangpanqin    时间: 2016-11-23 21:17
第二条 :  当一个线程访问“某对象”的“synchronized方法”或者“synchronized代码块”时,其他线程仍然可以访问“该对象”的非同步代码块。这个解释可能是没访问同步,但是已经进入while循环,获取不到锁对象,该线程阻塞状态,等获取到同步锁之后,可以执行,但是sum的值已经改变了,如果最后一句改成else if (sum<100){                     System.out.println(Thread.currentThread().getName()+"老师发了第"+sum+"份试卷,还剩"+(100-sum)+"份试卷");                 }
作者: 丁少    时间: 2017-3-29 17:42
[Java] 纯文本查看 复制代码
package thread;

public class Test5 {
         
    public static void main(String[] args) {
        MyRunnable mr =new MyRunnable();
        Thread t1 = new Thread(mr,"A");
        Thread t2 = new Thread(mr,"B");
        Thread t3 = new Thread(mr,"C");
        t1.start();
        t2.start();
        t3.start();
    }

}

class MyRunnable implements Runnable{
    private static int sum =1;
    Object obj=new Object();
    @Override
    public  void run() {
        while(true){
                synchronized ( obj) {
                         if(sum<=100){
                     try {
                         Thread.sleep(10);
                     } catch (InterruptedException e) {
                          
                         e.printStackTrace();
                     }
                     if(sum ==100){
                         System.out.println(Thread.currentThread().getName()+"老师发了第"+sum+"份试卷,试卷分发完毕");
                     }else{
                         System.out.println(Thread.currentThread().getName()+"老师发了第"+sum+"份试卷,还剩"+(100-sum)+"份试卷");
                     }
                     sum++;
                 }
                }
         
        }
    }
     
}

作者: 亮仔开发    时间: 2017-3-29 23:29
这题看了下有好多错的地方,我再看看怎么改




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2