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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

[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份试卷

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

3 个回复

倒序浏览
第二条 :  当一个线程访问“某对象”的“synchronized方法”或者“synchronized代码块”时,其他线程仍然可以访问“该对象”的非同步代码块。这个解释可能是没访问同步,但是已经进入while循环,获取不到锁对象,该线程阻塞状态,等获取到同步锁之后,可以执行,但是sum的值已经改变了,如果最后一句改成else if (sum<100){                     System.out.println(Thread.currentThread().getName()+"老师发了第"+sum+"份试卷,还剩"+(100-sum)+"份试卷");                 }
回复 使用道具 举报
[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++;
                 }
        	}
         
        }
    }
     
}
回复 使用道具 举报
这题看了下有好多错的地方,我再看看怎么改
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马