最近面试了很多候选人,发现好多人一被问到并发相关的内容就没有然后了,例如:
- 我:你平时工作中使用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的错误案例,那案例错误的原因,以及需要掌握的知识点我们会在下一篇连载文章搞懂i++,让面试官大吃一惊吧中进行详细的解答哦
如果觉得本篇文章对您用帮助的话,麻烦动动君的小手点个赞哟~
小编将持续为程序圈的你带来技术热文,一起进步吧~