public class Test {
private int a = 0;
public static void main(String[] args) {
Test test = new Test();
for (int i = 0; i <= 10; i++) {
new Thread(new Runnable() {
@Override
public void run() {
test.setA(test.getA() + 1);
}
}).start();
}
System.out.println(test.getA());
}
public int getA() {
return a;
}
public synchronized void setA(int a) {
this.a = a;
}
}
如果我把synchronide 放到run方法里则执行正确? 为什么呢? 锁不是当前对象吗? 只有一个test对象啊?
即使读和写都分别是原子的,读、加一(这个不涉及共享内存)、写这三个操作加在一起也不是原子的。线程依然可能在这三个操作之中被打断。
你咋放的?Java 有好多加 synchronize 的方式。
如果是
那么就没有问题,因为此时 读、加一、写 三者作为一个整体被保护起来了。