# 还在被volatile爆锤吗?脱坑指南了解一下 ####
程序员文章站
2022-04-05 08:58:06
...
最近面试了很多候选人,发现好多人一被问到并发相关的内容就没有然后了,例如:
- 我:你平时工作中使用volatile解决哪些问题?
- 候选人:
- 我:volatile和synchronized的区别是什么?它们分别适用的场景是什么?
- 候选人:
- 候选人:
好吧,然后就没有然后了~~~
很多候选人可能会想为什么面试官总是问我并发相关的东西呢,平时工作中我做CRUD根本用不到啊,好崩溃啊~
那我们来看看并发编程是否真的这么重要,为什么面试官总爱问???下面是我在技术交流群中找到的截图:
所以,学习并发编程对于通过面试实现升职加薪、项目优化提升并发、酷爱技术想要研究框架源码都是必不可少的!!!
那该怎么学呢?在这里我稍微梳理了下学习路径,如何平滑的掌握一套完整的知识体系,希望能给到大家一定的借鉴作用:
所以本篇文章我们先来聊聊volatile,如果想了解前置基础多线程的可以扫一扫文章底部二维码,关注我的公众号近期会更新呦。
话不多少,开奔主题。大家先看看如下代码,思考一下它的执行结果吧
public class VolatileTest {
public volatile int race = 0;
public void increase() {
race++;
}
public int getRace(){
return race;
}
public static void main(String[] args) {
//创建5个线程,同时对同一个volatileTest实例对象执行累加操作
VolatileTest volatileTest=new VolatileTest();
int threadCount = 5;
Thread[] threads = new Thread[threadCount];//5个线程
for (int i = 0; i < threadCount; i++) {
//每个线程都执行10000次++操作
threads[i] = new Thread(()->{
for (int j = 0; j < 10000; j++) {
volatileTest.increase();
}
System.out.println(Thread.currentThread().getName()+"执行10000次++后,race值为:"+volatileTest.getRace());
},"线程"+(i+1));
threads[i].start();
}
//等待所有累加线程都结束
for (int i = 0; i < threadCount; i++) {
try {
threads[i].join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//所有子线程结束后,race理论值应该是:5*10000=50000,但是执行结果会小于它,这是为啥呢?
System.out.println("累加结果:"+volatileTest.getRace());
}
}
在VolatileTest中,race是使用volatile关键字修饰的int类型变量,初始值为0。创建5个线程,对同一个volatileTest实例对象执行累加操作,每个线程执行10000次++操作。这样所有子线程结束后,race理论值应该是:5*10000=50000,但是执行结果会小于它,如下图。
内心是不是崩溃的,一个i++都会出问题???
上面给大家呈现的是一个volatile的错误用法,想要了解原因需要掌握以下知识:
- 并发的三大特性,以及volatile拥有哪几大特性?
- 了解i++的实现原理,需要掌握到字节码指令的知识哦
本篇文章主要给大家一个学习并发编程的思路,并展示了一个volatile的错误案例,那案例错误的原因,以及需要掌握的知识点我们会在下一篇连载文章中进行详细的解答哦
如果觉得本篇文章对您用帮助的话,麻烦动动君的小手点个赞哟~
小编将持续为程序圈的你带来技术热文,一起进步吧~
上一篇: 字符串最后一个单词的长度