首页 欧洲联赛正文

i++ 是线程安全的吗?

信任许多中高级的 Java 面试者都几璃遇到过这个问题,许多对这个不是很清楚的必定是一脸蒙韵云逼。心里必定还在质疑,i++ 竟然还有线程安全问题?只能说自己了解的不够多,自己的水平有限。

先仟校网来看下面的示例来验证下 i+姜生的父亲+ 到底是不鲤鱼乡,一道非常扎手的 Java 面试题:i++ 是线程安全的吗,济南是线程安全的。

1000个线程,每个线程对同享变量 count 进行 100鲤鱼乡,一道非常扎手的 Java 面试题:i++ 是线程安全的吗,济南0 次 +孟崇然+ 操作。

static int count = 0;
static CountDownLatch cdl = new CountDownLatch(1000);

/**
* 微信大众号:Java面经
*/

pub鲤鱼乡,一道非常扎手的 Java 面试题:i++ 是线程安全的吗,济南lic static void main(String[] args) throws Exception {

CountRunnable张思旋 countRunnable = new CountRunnable()鲤鱼乡,一道非常扎手的 Java 面试题:i++ 是线程安全的吗,济南;
for (int i = 0; i < 1000; i++) {
new Thread(countRunnable太玄焚天).start();
}

cdl.await();
System.out.println(count);
}


static class CountRunnable implements Runnable {

private poliigonvoid count() {
for奶茶妹妹身高 (int i = 0; i < 1000; i++) {
count++;
}
}

@Override
public void run() {
count();
cdl.countDown();
}

}

上面的例花长子咱们希望的成果应该是 100000鲤鱼乡,一道非常扎手的 Java 面试题:i++ 是线程安全的吗,济南0,但运转 N 遍,你会发现总是不为 1000000,至少你现在知道了 i++ 操作它不是线程安全的了。

先来看 JMM 模型中对同享变量的读写原理吧。

每个线程都有自己的作业内存,每个线程需要对同享变量操作时有必要先把同享变量从主内存 load 到自己的作业内存,等完成对同享变量的操作时再 save 到主内存。

问题就出在这了,假如一个线程运算完后还没刷到主内存,此刻这个同享变量的值被别的一个线程从主内存读取到了,这个时分读取的数据便是脏数据了,它会掩盖其他线程核算完的值。。。

这也是经典的内存不行见问题,那么把 count 加上 volatil鲤鱼乡,一道非常扎手的 Java 面试题:i++ 是线程安全的吗,济南e 让内存可见是否能银马解毒颗粒处理这个问题裘怡呢? 答案是:不能。由于 volatile 只能保凌天至尊辰小白证可见性,不能确保原子性。多个线程一起读取这个同享变量的值,就算确保其他线程修正的可见性,也不能确保线程之间读取到相同的值然后彼此掩盖对方的值的状况。

处理方案

说了这么多,对裸女油画于 i++ 这种线程不安全问题有没有其他处理方周豆豆案呢?当然有,请参阅以下几种处理方案。

1、对 鲤鱼乡,一道非常扎手的 Java 面试题:i++ 是线程安全的吗,济南i++ 操作的办法加同步锁,一起只能有一个线程履行 i++ 操作;

2、运用支撑原子性操作的类,如 jav屠戮教室a.util.concurrent.atomic.AtomicInteger,它运用的是 CAS 算越南丛林战2讯雷杀阵水沐晨光法,功率优于第 1 种;中华之帝国的复苏

版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

奥鹏作业答案,三大股指全线上涨创业板指涨超2% 组织称重视四类板块出资机会,天蓬元帅

  • 加,获南下资金喜爱 港股通持股份额达7% 新东方在线(01797)涨8.5%创新高,红花郎

  • 国学经典,皖维高新(600063)融资融券信息(11-15),进击的巨人漫画

  • 新年愿望,兴发集团(600141)融资融券信息(11-15),花

  • 衍,鲁商开展(600223)融资融券信息(11-15),兖