還在被volatile爆錘嗎?脫坑指南了解一下

最近面試了很多候選人,發(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)步吧~


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容