最近面試了很多候選人,發(fā)現(xiàn)好多人一被問到并發(fā)相關(guān)的內(nèi)容就沒有然后了,例如:
-
我:你平時(shí)工作中使用volatile解決哪些問題?
-
候選人:
-
候選人:
-
我:volatile和synchronized的區(qū)別是什么?它們分別適用的場景是什么?
-
候選人:
-
候選人:
-
我:你對(duì)volatile如何實(shí)現(xiàn)可見性和有序性了解嗎?
-
候選人:
-
候選人:
好吧,然后就沒有然后了~~~
很多候選人可能會(huì)想為什么面試官總是問我并發(fā)相關(guān)的東西呢,平時(shí)工作中我做CRUD根本用不到啊,好崩潰啊~
那我們來看看并發(fā)編程是否真的這么重要,為什么面試官總愛問???下面是我在技術(shù)交流群中找到的截圖:




所以,學(xué)習(xí)并發(fā)編程對(duì)于通過面試實(shí)現(xiàn)升職加薪、項(xiàng)目優(yōu)化提升并發(fā)、酷愛技術(shù)想要研究框架源碼都是必不可少的!??!
那該怎么學(xué)呢?在這里我稍微梳理了下學(xué)習(xí)路徑,如何平滑的掌握一套完整的知識(shí)體系,希望能給到大家一定的借鑒作用:

所以本篇文章我們先來聊聊volatile,如果想了解前置基礎(chǔ)多線程的可以掃一掃文章底部二維碼,關(guān)注我的公眾號(hào)近期會(huì)更新呦。
話不多少,開奔主題。大家先看看如下代碼,思考一下它的執(zhí)行結(jié)果吧
<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="java" cid="n32" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">public class VolatileTest {
public volatile int race = 0;
public void increase() {
race++;
}
public int getRace(){
return race;
}
public static void main(String[] args) {
//創(chuàng)建5個(gè)線程,同時(shí)對(duì)同一個(gè)volatileTest實(shí)例對(duì)象執(zhí)行累加操作
VolatileTest volatileTest=new VolatileTest();
int threadCount = 5;
Thread[] threads = new Thread[threadCount];//5個(gè)線程
for (int i = 0; i < threadCount; i++) {
//每個(gè)線程都執(zhí)行10000次++操作
threads[i] = new Thread(()->{
for (int j = 0; j < 10000; j++) {
volatileTest.increase();
}
System.out.println(Thread.currentThread().getName()+"執(zhí)行10000次++后,race值為:"+volatileTest.getRace());
},"線程"+(i+1));
threads[i].start();
}
?
//等待所有累加線程都結(jié)束
for (int i = 0; i < threadCount; i++) {
try {
threads[i].join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
?
//所有子線程結(jié)束后,race理論值應(yīng)該是:5*10000=50000,但是執(zhí)行結(jié)果會(huì)小于它,這是為啥呢?
System.out.println("累加結(jié)果:"+volatileTest.getRace());
}
}</pre>
在VolatileTest中,race是使用volatile關(guān)鍵字修飾的int類型變量,初始值為0。創(chuàng)建5個(gè)線程,對(duì)同一個(gè)volatileTest實(shí)例對(duì)象執(zhí)行累加操作,每個(gè)線程執(zhí)行10000次++操作。這樣所有子線程結(jié)束后,race理論值應(yīng)該是:5*10000=50000,但是執(zhí)行結(jié)果會(huì)小于它,如下圖。

內(nèi)心是不是崩潰的,一個(gè)i++都會(huì)出問題???
上面給大家呈現(xiàn)的是一個(gè)volatile的錯(cuò)誤用法,想要了解原因需要掌握以下知識(shí):
并發(fā)的三大特性,以及volatile擁有哪幾大特性?
了解i++的實(shí)現(xiàn)原理,需要掌握到字節(jié)碼指令的知識(shí)哦
本篇文章主要給大家一個(gè)學(xué)習(xí)并發(fā)編程的思路,并展示了一個(gè)volatile的錯(cuò)誤案例,那案例錯(cuò)誤的原因,以及需要掌握的知識(shí)點(diǎn)我們會(huì)在下一篇連載文章搞懂i++,讓面試官大吃一驚吧中進(jìn)行詳細(xì)的解答哦
如果覺得本篇文章對(duì)您用幫助的話,麻煩動(dòng)動(dòng)君的小手點(diǎn)個(gè)贊喲~
小編將持續(xù)為程序圈的你帶來技術(shù)熱文,一起進(jìn)步吧~



