java多线程 同步方法也会被抢, 就是只有同步方法在其他线程要访问同一个实例的同步方法时。。。。...

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);
}
}
}
}

转载于:https://www.cnblogs.com/tianweijiang/p/5727418.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值