public class Sum implements Runnable{
    static int sum=5;
boolean flag=true;
public Sum(boolean flag) {
super();
this.flag=flag;

public synchronized void run() {
while (-30<sum&&sum<30) {
if(flag) {
add();
}else {
sub();
}
}
}
public synchronized void add() {
sum=sum+4;
System.out.println(Thread.currentThread().getName()+"加后:"+sum);
}
public synchronized void sub() {
sum=sum-5;
System.out.println(Thread.currentThread().getName()+"减后:"+sum);
}
}
主方法
  Sum[] array=new Sum[4];
for(int i=0;i<array.length;i++) {
Sum sum=new Sum(i%2==0?true:false);
Thread t=new Thread(sum,"线程"+i);
t.start();
               }运行结果
线程0加后:9
线程0加后:7
线程3减后:3
线程2加后:8
线程2加后:10
线程2加后:14
线程1减后:4
线程1减后:13
线程1减后:8
线程1减后:3
线程1减后:-2
线程1减后:-7
线程1减后:-12
线程1减后:-17
线程1减后:-22
线程1减后:-27
线程1减后:-32
线程2加后:18
线程3减后:6
线程0加后:11

解决方案 »

  1.   

    你想问啥?
    public synchronized void add()
    这种写法下同步约束只能对实例级别有效。
    而你的sum是类级别的属性。所以估计你期望的效果应该不成立。
      

  2.   

    直接看代码容易懂,使用synchronized 关键字
    public class SyncStack {

      private Vector<Character> buffer = 
       new Vector<Character>(100, 20);//初始100,增量20  public synchronized char pop() {
        char c;
        while (buffer.size() == 0) {//没有数据,等待
         System.out.println("WAITing......");
          try {this.wait();  } catch (InterruptedException e) {   }
        }   
        //获取数据 
        c = (buffer.remove(buffer.size()-1)).charValue();
        System.out.println(" >>" +Thread.currentThread().getName() + ": " + c);
        return c;
      }  public synchronized void push(char c) {
        this.notify(); //是否位置必须放在方法的最后?
        Character charObj = new Character(c);
        buffer.addElement(charObj);    
        System.out.println( Thread.currentThread().getName() + ": " + c);
      }
    }
      

  3.   


    我发了三个比较直观的线程列子在博客,你可以copy过来看看,对你或许有帮助。  死锁-----单列与同步-------消费者模式(多对多)   分别由浅至深。http://bbs.csdn.net/topics/392287406
      

  4.   

    public synchronized void add()这样写只对同一个实例化对象起同步,Sum sum=new Sum(i%2==0?true:false);而你这里new了多个,所以锁不起作用,你可以改成public static synchronized void add() 或者用代码块synchironized(Sum.class){}
      

  5.   

    select * from emp
      

  6.   

    用这种方式public static synchronized void add()或者synchironized(Sum.class){},这样就可以对Sum.class对象进行同步,也就可以对Sum里的静态变量sum进行同步了。再或者你重新建个类A,把sum静态变量写进去后,只建一个A,把他作为Sum 的构造参数,这样你的Sum线程就可以建多个了,因为他们只是共同操作你建的那一个A类的对象。