public class Test4 implements Runnable {
private int count = 10;
@Override
public /*synchronized*/ void run() {
count -- ;
System.out.println(Thread.currentThread().getName() + "count : "+count);
}
public static void main(String[] args) {
Test4 t = new Test4();
for (int i = 0 ; i < 10 ; i ++ ){
new Thread(t,"THREAD"+i).start();
}
}
}
注意:这里有10个线程,t这个对象是10个线程共享的对象。
分析:之所以并发执行run方法会产生问题,原因有二,
其一是:count-- 非原子操作。
其二是:run方法中有两行代码,假设两行代码每一行各是原子操作,但整个run方法也不是原子操作。
加上synchronized关键字后,相当于把整个的:
count -- ;
System.out.println(Thread.currentThread().getName() + "count : "+count);
这两行代码变为了一个原子操作。