我想不出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();
}
}
}}
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();
}
}
}}
inc();
} 这个线程执行完INC,(没有sleep, 也没有wait, ) 下一个线程才开始执行DEC, 怎么会有乱序?
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变量 所以会造成乱序。
因为,加线程对j的累加值与减线程的累加值相等,
那么,这4个线程运行后,j变量的值应该等于初始值0。
如果不加同步标示符,则j的结果值可能不会为0.
具体原因就是线程安全问题。
由于CPU时间片的缘由,从微观上看,其实系统中的每个运行的进程或线程,在某一时间点上都是单独运行的,并不是同时运行的。只是这个时间非常短,所以在我们看来,他们好像是同时运行的。
所以在程序中:
如果线程1正好运行在inc()方法,此时j假设为5,而且正好运行在j++这句,运行完这句j变为6.这时时间片转到线程2上
运行dec(),将j--,变为5,这时如果时间片在回到线程1上,就会直接打印出5或可能比5还小的数值。
这样数据就是错误的。所以在操作他们共同的资源j时,必须加上synchronized关键字。