今天有人问了一个线程的问题,然后自己看着看着也不明白了。所以希望大家指导我下,谢谢。代码如下:public class Example
{  public  static void main(String args[])
   {  People teacher,student;
      ComputerSum sum=new ComputerSum();
      teacher=new People("老师",200,sum); 
      student =new People("学生",200,sum); 
      teacher.start();  
      student.start();
   }
}
class ComputerSum
{ int sum;
  public void setSum(int n)
  {  sum=n;
  } 
  public int getSum()
  {  return sum;
  }
}
class People extends Thread
{  int timeLength;        //线程休眠的时间长度
   ComputerSum sum;
   People(String s,int timeLength,ComputerSum sum) 
   { setName(s);        //调用Thread类的方法setName为线程起个名字
     this.timeLength=timeLength;
     this.sum=sum;
   }
   public void run()
   {  for(int i=1;i<=5;i++)
       {  int m=sum.getSum();
          sum.setSum(m+1);
          System.out.println("我是"+getName()+",现在的和:"+sum.getSum());
          try {  sleep(timeLength);
              }
          catch(InterruptedException e){}
       }
   } 
}teacher和student共享一个ComputerSum对象,我想让它互斥的访问ComputerSum对象里的sum字段.我在ComputerSum的getSum和setSum方法声明前加了synchronized。可是执行的结果不是预期的:
1..2..3..4..5.....10,有的就跳过执行了。请指正,谢谢。

解决方案 »

  1.   

    答:getSum和setSum方法声明前加了synchronized,可起到互斥的访问ComputerSum对象里的sum字段,这是正确的啊.你预期的结果是什么啊?
      

  2.   

    我觉得代码应该这样写比较好,获得sum,sum + 1,然后再获得sum应该作为一个原子操作来看待public class Example {
    public static void main(String args[]) {
    People teacher, student;
    ComputerSum sum = new ComputerSum();
    teacher = new People("老师", 3, sum);
    student = new People("学生", 1, sum);
    teacher.start();
    student.start();
    }
    }class ComputerSum {
    int sum; public synchronized int setSum(int n) {
    sum = n + sum;
    return sum;
    }}class People extends Thread {
    int timeLength; // 线程休眠的时间长度
    ComputerSum sum; People(String s, int timeLength, ComputerSum sum) {
    setName(s); // 调用Thread类的方法setName为线程起个名字
    this.timeLength = timeLength;
    this.sum = sum;
    } public void run() {
    for (int i = 1; i <= 5; i++) {
    System.out.println("我是" + getName() + ",现在的和:" + sum.setSum(1));
    try {
    sleep(timeLength);
    } catch (InterruptedException e) {
    }
    }
    }
    }
      

  3.   


    public void run() {
    for (int i = 1; i <= 5; i++) {
    try {
    sleep(timeLength);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    synchronized (sum) {
    int m = sum.getSum(); sum.setSum(m + 1);
    System.out.println("我是" + getName() + ",现在的和:" + sum.getSum()); }
    }
    }
    我是老师,现在的和:1
    我是学生,现在的和:2
    我是老师,现在的和:3
    我是学生,现在的和:4
    我是老师,现在的和:5
    我是学生,现在的和:6
    我是老师,现在的和:7
    我是学生,现在的和:8
    我是老师,现在的和:9
    我是学生,现在的和:10