我想不出inc, dec为什么要加同步这个关键字, 能不能举一个例子, 如果没有同步, 会发生什么情况?package headfirst.observer.weather;public class ThreadTest1 { private int j; public static void main(String args[]) { ThreadTest1 tt = new ThreadTest1(); Inc inc = tt.new Inc(); Dec dec = tt.new Dec(); for (int i = 0; i < 2; i++) {
Thread t = new Thread(inc);
t.start();
t = new Thread(dec);
t.start();
} } private synchronized void inc() {
j++;
System.out.println(Thread.currentThread().getName() + "-inc:" + j);
} private synchronized void dec() {
j--;
System.out.println(Thread.currentThread().getName() + "-dec:" + j);
} class Inc implements Runnable { public void run() { for (int i = 0; i < 100; i++) {
inc();
}
}
} class Dec implements Runnable { public void run() { for (int i = 0; i < 100; i++) {
dec();
}
}
}}

解决方案 »

  1.   

    多线程同步问题。如果不加,结果有可能是错的,因为一个变量被两个独立线程所使用,java又无法保证线程运行的时间和顺序。假如那两个方法不是同步的,在运行inc()方法的过程中,dec()有可能会被运行,那么会造成运行结果不准确.同步以后,如果inc()在运行中时,inc()中使用的变量都会被保护起来,这样dec()要等待inc()方法运行完毕后再运行。你可以去掉同步关键词后,运行试试看。中间的打印结果可能是乱序的。
      

  2.   

    for (int i = 0; i < 100; i++) {
    inc();
    } 这个线程执行完INC,(没有sleep, 也没有wait, ) 下一个线程才开始执行DEC, 怎么会有乱序?
      

  3.   

    我说一下我的看法吧,说错了莫怪。for (int i = 0; i < 2; i++) { 
    Thread t = new Thread(inc); 
    t.start(); 
    t = new Thread(dec); 
    t.start(); 
    } 当两个start执行的时候 两个线程已经被启动了(就是2楼说的独立),这样的话两个线程的执行代码for (int i = 0; i < 100; i++) { 
    inc(); 
    } for (int i = 0; i < 100; i++) { 
    dec(); 
    } 之间就再也没有顺序的关系,不是执行完一个再执行另一个,但是因为他们同是操作的是J变量 所以会造成乱序。
      

  4.   

    所有线程都访问的是同一个对象的j变量。
    因为,加线程对j的累加值与减线程的累加值相等,
    那么,这4个线程运行后,j变量的值应该等于初始值0。
    如果不加同步标示符,则j的结果值可能不会为0.
    具体原因就是线程安全问题。
      

  5.   

    楼主,如果你的程序不加同步标识,就会出现以下情况:
    由于CPU时间片的缘由,从微观上看,其实系统中的每个运行的进程或线程,在某一时间点上都是单独运行的,并不是同时运行的。只是这个时间非常短,所以在我们看来,他们好像是同时运行的。
    所以在程序中:
    如果线程1正好运行在inc()方法,此时j假设为5,而且正好运行在j++这句,运行完这句j变为6.这时时间片转到线程2上
    运行dec(),将j--,变为5,这时如果时间片在回到线程1上,就会直接打印出5或可能比5还小的数值。
    这样数据就是错误的。所以在操作他们共同的资源j时,必须加上synchronized关键字。