多线程下lambda表达式和非多线程执行结果不一致问题
恭贺码农朋友们 2022新年开工大吉
闲来无事看看java多线程,多线程下使用lambda表达式和非lambda表达式运行结果不一致,lambda表达式执行结果总是小于20000,而非lambda表达式执行结果总是等于20000,多线程不安全,期望结果是小于20000,所以有点纳闷
老规矩,先上代码
public class SynchronizedTest {
public static volatile int race = 0;
private static CountDownLatch countDownLatch = new CountDownLatch(2);
public static void main(String[] args) throws InterruptedException {
for (int i = 0; i < 2; i++) {
/* lambda 表达式实现多线程
Thread ti = new Thread(() -> {
for (int j = 0; j < 10000; j++) {
race++;
}
countDownLatch.countDown();
});*/
// 非lambda表达式实现
Thread ti = new Thread(new Runnable() {
@Override
public void run() {
for (int j = 0; j < 10000; j++) {
race++;
}
countDownLatch.countDown();
}
});
ti.setName("线程" + i);
System.out.println("当前线程:" + ti.getName());
ti.start();
}
countDownLatch.await();
System.out.println(race);
}
}
多方查证未果,后经将自增数值调至1亿后,发现两种多线程实现达到了预期结果,所以大胆猜测,lambda表达式不止简化了代码,还优化了代码,使代码运行更快、更高效了。
参考
参考了两篇博文发现跟自己猜测有矛盾,所以再猜测一下,虽然lambda执行代码逻辑需要额外处理一些指令,但还是比匿名内部类执行的效率高
纯属瞎猜,望各位大佬指点,瑞思拜!