标签:
ackage cn.twj.rtti.t;//: concurrency/AtomicityTest.java
import java.util.concurrent.*;
public class AtomicityTest implements Runnable {
private int i = 0;
public int getValue() {
return i;
}
//设置此方法为同步方法的意思并不是说进入此方法后其他线程就会等待此方法完成了
//在非进入此方法的线程中,还是会和当前线程抢占
//有可能在执行到第一句的时候就被其他线程抢过去了。但是由于同步块确保了变量的可视性,导致在执行完第一句(也是非原子性操作的,或者还没执行完第一句就被其他线程抢走了,并没有自增完成),
// i的值就向主内存中刷新了而其他线程获取i变量时就还是0
//而在其他线程执行的时间内中,此方法挂起
//还有有可能在执行完第一条语句后被抢走执行权,所以那时候i的值为奇数
//所以Main方法返回为会奇数,然后退出线程
//结果1:就是只有同步方法在其他线程要访问同一个实例的同步方法时,才会进行挂起直接执行的操作,而对于非同步方法 如getValue ,其他线程是可以在某个线程执行同一个实例的同步方法时进入
//非同步方法的,因为该方法没有锁(this)
//结果2:同步方法也会被抢,只是在共享同一方法时 其操作类似于原子性,其他线程必须等待拿到锁的线程释放锁之后才能执行
private synchronized void evenIncrement() {
i++;
i++;
}
public void run() {
while (true)
evenIncrement();
}
public static void main(String[] args) {
ExecutorService exec = Executors.newCachedThreadPool();
AtomicityTest at = new AtomicityTest();
exec.execute(at);
while (true) {
int val = at.getValue();
if (val % 2 != 0) {
System.out.println(val);
System.exit(0);
}
}
}
}
java多线程 同步方法也会被抢, 就是只有同步方法在其他线程要访问同一个实例的同步方法时。。。。
标签:
原文地址:http://www.cnblogs.com/tianweijiang/p/5727418.html