国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

事與愿違:可變類出現(xiàn)了線程安全問題

開發(fā) 前端
理解可變類引發(fā)線程安全問題的原因,重點理解什么是可變類,以及可變類在多線程環(huán)境下存在的問題,能夠結合自身實際項目思考哪些場景下可變類會引發(fā)線程安全問題,并能夠思考問題背后的解決方案。

大家好,我是冰河~~

“確實在公司跟著老大能學到很多知識啊,之前確實也不怎么了解線程安全問題和一些解決方案,現(xiàn)在了解了,也終于基于不可變類實現(xiàn)了一個簡單的功能,明天找老大幫我看看“,小菜心里想著,臉上露出了滿意的微笑。

一、情景再現(xiàn)

上回說到:小菜在自己實現(xiàn)分配的統(tǒng)計商品詳情接口調用次數(shù)的功能時,沒注意線程安全問題,導致統(tǒng)計出來的結果數(shù)據(jù)與實際結果偏差較大,通過老王的耐心講解,知道了背后產生問題的根本原因,也學到了幾種并發(fā)問題的解決方案。

下班后,小菜自己嘗試基于不可變類實現(xiàn)一個簡單的功能,但是。。。

二、事與愿違

第二天,小菜早早來到公司,昨天自己想基于不可變類實現(xiàn)一個簡單的功能,經過自己不懈的努力,終于“完成”了自己想象的功能,心里也是比較高興的。就等著老王來公司后,給老王看看自己實現(xiàn)的功能。

正想著,小菜聽到了老王說話的聲音,原來是老王跟幾個同事一起到公司了。看著老王走到了自己的工位上,小菜拿著自己的電腦來到老王身邊說:”老大,我昨天學了不少并發(fā)問題的解決方案,對不可變類這種方式很感興趣,回去后自己基于這種方式實現(xiàn)了一個小功能,你幫我看看實現(xiàn)的對嗎?“。

老王聽后說:“我看看,你給我簡單說下實現(xiàn)的功能是啥?”。

“咱們乘坐高鐵,在進站時不是都要通過身份證檢票嗎,我就想通過不可變類模擬實現(xiàn)一個檢票的功能,這個檢票功能支持并發(fā)訪問,也就是同時支持多個人拿著身份證通過檢票。

在實現(xiàn)上,我想的比較簡單,就是通過一個名字和身份證編號來定義一個不可變類,表示一個用戶,由這個不可變類支持線程安全。再由一個Map來存儲這些用戶的信息,當用戶通過檢票時,更新下用戶的信息,最終打印出來。整個過程基于不可變類實現(xiàn)線程安全”。

“我還畫了一張圖”,說著小菜從電腦里打開了自己畫的場景需求圖,如圖4-1所示。

圖片

老王聽了后說:“嗯,我大概明白你的需求了,我看看代碼實現(xiàn)”。

于是小菜便把電腦給了老王,要不說老王是大牛呢?老王只是用他那凌厲的眼掃了一眼,便說道:“這代碼有問題”。

“啊”,小菜當時就有點懵,“這,我覺得沒問題呀”。。。

三、分析代碼

“那我們就結合代碼來分析下原因吧”,老王說著,便讓小菜看代碼。“首先是這個User用戶類”。

User類的源碼詳見:concurrent-design-patterns-immutable工程下的io.binghe.concurrent.design.demo.wrong.User。

public class User {

    private String name;
    private Long idCard;

    public void set(String name, Long idCard){
        this.name = name;
        this.idCard = idCard;
    }
    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", idCard=" + idCard +
                '}';
    }
}

“這個User類就是有問題的,你知道什么是不可變類嗎?”,老王問小菜。

小菜說:“知道,就是一個類一經創(chuàng)建,就不會發(fā)生變化的類,就叫做不可變類”。

“對,概念記得倒是挺清楚的,但是這個User類不是一個不可變類呀,我們根據(jù)不可變類的定義分析下這個User類為什么不是一個不可變類”,老王巴拉巴拉的說了起來??傮w上,老王針對User類為什么不是不可變類,總結了如下幾點:

  • 用戶類沒有被final修飾,可以有其他類繼承User類,一旦有子類繼承,就可能改變User類的狀態(tài)。
  • User類里的成員變量沒有被final修飾,可能會發(fā)生變化。
  • User類中提供了修改成員變量的方法。成員變量可能發(fā)生變化。
  • User類的set()方法也不是原子的,存在線程安全問題,多個線程同時訪問可能會存在并發(fā)問題。

“明白了嗎?”,老王問小菜。

“明白了”,小菜回答道,“其實我總覺得哪里有點怪,就是說不上來,我以為我寫的是對的”,小菜不好意思的笑了笑。

“那我們再來看看你寫的這個TicketCheck類”,老王繼續(xù)說道,說著打開了小菜寫的TicketCheck類的代碼片段。

TicketCheck類的源碼詳見:concurrent-design-patterns-immutable工程下的io.binghe.concurrent.design.demo.wrong.TicketCheck。

public class TicketCheck {

    private Map<String, User> userMap = new ConcurrentHashMap<>();

    public void updateUser(String userKey, String userName, Long idCard){
        User user = userMap.get(userKey);
        user.set(userName, idCard);
        System.out.println(Thread.currentThread().getName() + "--當前檢票的用戶是:" + user.toString());
        userMap.put(userKey, user);
    }

    public User getUser(String userKey){
        return userMap.get(userKey);
    }
}

“這個類也相對比較簡單”,老王繼續(xù)說道:“但是這類會改變User對象內部的狀態(tài),User類本身就不是一個不可變類,加上TicketCheck類也確實通過用戶類的set()方法改變了用戶類的狀態(tài),如果多個線程訪問了同一個userKey中的User對象,就可能會存在線程安全問題,所以整體不能基于不可變類保證線程安全”。

此時的小菜有點一臉懵逼,眉頭擰成了一個麻花。

老王看了一眼小菜,說到:“剛才我說的聽明白了嗎?”。

“有點聽不明白了”,我寫的TicketCheck類,其實并不是要修改User類,而是為User類設置userName和idCard屬性,實際并不會修改User類的信息,只是記錄檢票的用戶,并且打印用戶的信息,不太明白為啥不能基于不可變類保證線程安全“。

“這樣吧,我給你畫張圖分析一下”,老王說道。

于是,老王打開了電腦的畫圖工具。。。

四、畫圖分析

要不說老王這人就是牛,對其他同事也特別好呢,不一會,就畫出了一張分析圖,如圖4-2所示。

圖片

“我們就基于你寫的User類進行講解,看這張圖”,老王繼續(xù)說到,“假設現(xiàn)在user對象的name為張三,idCard為1001,線程1獲取到用戶信息時,此時的name為張三,idCard為1001,線程1調用user對象的set()方法來修改用戶的信息。我們來看user的set()方法”,老王又打開了User類的代碼,重點讓小菜看set()方法的代碼。

public void set(String name, Long idCard){
    this.name = name;
    this.idCard = idCard;
}

“在set()方法中,會分別修改user的name字段和idCard的值,這個過程并不是原子操作,線程1在執(zhí)行set()方法時,在更新完name字段的值時,如果此時恰好發(fā)生了線程切換,線程2獲取用戶信息時,獲取到的用戶的name字段為張三,idCard字段為1001。這時,線程2獲取到的數(shù)據(jù)是錯亂的,線程2獲取到的用戶name字段為李四,idCard卻是張三的身份證編號,用戶數(shù)據(jù)發(fā)生了錯亂的現(xiàn)象,出現(xiàn)了線程安全問題”。

“這么說能聽明白嗎?”,老王又問小菜。

“嗯,這次明白了”,小菜回復到。

“那我們繼續(xù)講講怎么寫不可變類的代碼吧”,老王接著說。

“好的”。

正當老王準備講如何寫不可變類的代碼時,此時聽到一個熟悉的聲音,“王工,有個新的需求要和技術這邊一起討論下可行性,你參與一下呀?”,老王抬頭一看,原來是產品經理,邊說邊往這邊走,于是回了句:“好的”。

老王轉過有來對小菜說:“那我們今天就到這兒,你先結合今天分析的內容,思考下怎么寫不可變的類,有時間咱們再接著聊,我去開會”。(老王真特么是個大好人)。

“好的”,小菜接著說。

于是,老王拿著電腦跟產品經理去開會了,小菜回到了自己的工位,開始了一天的工作。。。

五、本章總結

本章,以場景故事的形式描述了不可變類存在的線程安全問題,以及對不可變類存在的線程安全問題進行了分析。

責任編輯:姜華 來源: 冰河技術
相關推薦

2023-09-26 21:59:48

安全REST軟件架構

2020-06-14 08:55:24

網(wǎng)絡安全信息泄露網(wǎng)絡釣魚

2022-04-11 10:56:43

線程安全

2024-09-17 17:50:28

線程線程安全代碼

2012-02-21 14:14:47

Java

2016-11-23 15:48:05

iOS APPCache

2011-03-29 10:41:51

Java線程安全

2021-07-26 06:57:59

Synchronize線程安全

2019-04-04 11:55:59

2021-03-23 18:32:46

JavaScript編程開發(fā)

2012-11-20 10:47:16

2009-05-30 09:36:18

2022-12-30 21:26:56

2022-04-06 07:50:28

線程安全代碼

2009-11-03 13:46:56

Oracle密碼

2011-11-17 10:34:14

內網(wǎng)安全

2013-09-05 09:42:06

2011-03-21 10:23:06

2011-05-20 11:59:32

2012-12-11 11:28:20

點贊
收藏

51CTO技術棧公眾號

国产精品一区2区| 国产精品污www在线观看| 亚洲午夜av久久乱码| 免费看污污网站| 视频在线观看一区| 国产精国产精品| 97欧美成人| 疯狂做受xxxx高潮欧美日本| 无码人妻精品一区二区三区在线| 黄色日韩精品| 欧美亚洲伦理www| 666av成人影院在线观看| 欧美午夜宅男影院| 羞羞免费视频网站| 国产麻豆精品在线观看| 玖玖玖精品中文字幕| 欧美综合一区| 午夜免费久久久久| 精品久久久网| 亚洲人成在线一二| 69av成人| 精品久久国产老人久久综合| 日本成人一区二区三区| 一区二区三区日本| 久久久久久三级| 99久久精品国产一区二区三区| 中国成人亚色综合网站 | 国产原创精品视频| 亚洲va韩国va欧美va精品| 性欧美极品xxxx欧美一区二区| 精品午夜一区二区三区在线观看| 国模精品娜娜一二三区| 欧美成人久久| 91原创国产| 红桃视频国产精品| 国产精品久久精品国产| 综合久久亚洲| 91精品久久久久久久久久久久久久 | 亚洲mv大片欧洲mv大片精品| 亚洲五月天综合| 久久久久久久久久久电影| 日韩欧美猛交xxxxx无码| 国内精品国产三级国产a久久 | 亚洲一区精品在线| 波多野结衣在线中文| 中文字幕中文字幕在线一区| 四虎永久在线高清国产精品| 日本一二三不卡| www.4438全国最大| 亚洲专区一二三| 日本在线三级| 91黄色在线观看| 麻豆tv入口在线看| 精品国产乱码久久久久久久| 中文字幕资源网在线观看| 日韩视频中午一区| 日本在线播放一二三区| 日韩中文字幕网址| 无码国模国产在线观看| 55夜色66夜色国产精品视频| 日韩在线精品| 麻豆亚洲一区| 国产成人综合视频| 色视频网站在线| 日韩欧美在线免费观看| а√天堂资源地址在线下载| 日韩电影第一页| 亚洲精品在线a| 成人免费网视频| 久久人人精品| 欧美又粗又长又爽做受| 国产免费成人在线视频| 在线观看视频你懂的| 欧美人体做爰大胆视频| 综合日韩av| 欧美制服第一页| 亚洲一区免费| 丁香花在线影院观看在线播放| 中文字幕一区二区三区四区| 国产一区电影| 亚洲欧洲日产国产网站| 国产精品久av福利在线观看| 91日本在线观看| 国产精品综合在线视频| av二区三区| 精品国产欧美一区二区| 777久久精品| 蜜桃视频成人| 欧美高清在线视频| 免费观看久久久久| 欧美成人一二三| 伊人久久大香线蕉av超碰演员| 一二三四中文字幕| 亚洲一区二区三区四区在线免费观看 | 亚洲精品国产精华液| 韩国av网站在线| 欧美日韩成人在线观看| 欧美性色综合| 日韩免费高清在线| 欧美日韩成人激情| 国产精品欧美一区二区三区不卡| 国产日韩在线免费| 成人av动漫在线| 色多多视频在线观看| 欧美另类69精品久久久久9999| 日韩图片一区| 国产主播福利| 在线视频精品一| 一本色道久久综合亚洲精品高清| 一级在线免费视频| 亚洲精品按摩视频| 欧美1级日本1级| www.天天射.com| 亚洲欧美另类在线观看| 五月天久久777| 99精品视频在线看| 亚洲成人av片| 激情国产一区| 深夜宅男网站免费进入| www.亚洲免费视频| 麻豆专区一区二区三区四区五区| 亚洲精品套图| 国语自产在线不卡| 国产69精品久久99不卡| 午夜伦全在线观看| 成人精品视频久久久久| 中文一区二区完整视频在线观看| 中文字幕影音在线| 欧美性xxxx69| 欧美亚洲高清一区二区三区不卡| 日韩国产在线不卡视频| 在线无限看免费粉色视频| 欧美在线视频不卡| 成人影院在线| 国产剧情演绎av| 欧美国产日韩免费| 成人福利在线看| 高清电影在线免费观看| 国产精品国产精品| 欧美日韩国产区| 国产精品一区二区三区av麻| 妞干网在线视频观看| 亚洲精品99久久久久中文字幕| 国产欧美一区二区三区国产幕精品| 成年网站免费| 韩国国内大量揄拍精品视频| 91偷拍与自偷拍精品| 天天综合网天天| 一区二区三区av| 成人午夜大片免费观看| 精品色999| 麻豆传媒在线免费看| 男女激烈动态图| 日韩激情第一页| 亚洲第一毛片| 不卡av免费观看| 国产精品高清乱码在线观看| 日韩精品成人在线观看| 午夜在线精品偷拍| 国产在线国偷精品免费看| 国产精品久久| 999国产精品一区| 婷婷国产精品| 手机在线一区二区三区| 99热在线精品观看| 极品av少妇一区二区| 日本欧美视频| 91不卡在线观看| av中文字幕在线不卡| 国产欧美一区二区在线观看| 成人高清伦理免费影院在线观看| 久久影视一区二区| 亚洲欧美日韩国产中文| 欧美xxxxxxxx| 日韩三级在线免费观看| 性色av一区二区三区在线观看| 丁香婷婷久久久综合精品国产| 日韩高清国产精品| 男女人搞j网站| 你懂的在线视频| 午夜av在线播放| 伊人成综合网站| 色综合咪咪久久网| 国产精品国模大尺度视频| av亚洲精华国产精华精华| 蜜桃av噜噜一区二区三区小说| 国产**成人网毛片九色| 在线不卡一区二区| 亚洲成人免费在线视频| 91免费版网站在线观看| 亚洲成人精品一区二区三区| 亚洲人辣妹窥探嘘嘘| 久久午夜剧场 | 91精品天堂福利在线观看| 欧美成人ⅴideosxxxxx| 黑人精品一区| 中文字幕成人| 成人羞羞网站入口| 久久青草久久| 99久久亚洲一区二区三区青草|