日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

事與愿違:可變類出現了線程安全問題

來源: 責編: 時間:2023-10-27 17:20:52 277觀看
導讀大家好,我是冰河~~“確實在公司跟著老大能學到很多知識啊,之前確實也不怎么了解線程安全問題和一些解決方案,現在了解了,也終于基于不可變類實現了一個簡單的功能,明天找老大幫我看看“,小菜心里想著,臉上露出了滿意的微笑。

OIj28資訊網——每日最新資訊28at.com

大家好,我是冰河~~OIj28資訊網——每日最新資訊28at.com

“確實在公司跟著老大能學到很多知識啊,之前確實也不怎么了解線程安全問題和一些解決方案,現在了解了,也終于基于不可變類實現了一個簡單的功能,明天找老大幫我看看“,小菜心里想著,臉上露出了滿意的微笑。OIj28資訊網——每日最新資訊28at.com

一、情景再現

上回說到:小菜在自己實現分配的統計商品詳情接口調用次數的功能時,沒注意線程安全問題,導致統計出來的結果數據與實際結果偏差較大,通過老王的耐心講解,知道了背后產生問題的根本原因,也學到了幾種并發問題的解決方案。OIj28資訊網——每日最新資訊28at.com

下班后,小菜自己嘗試基于不可變類實現一個簡單的功能,但是。。。OIj28資訊網——每日最新資訊28at.com

二、事與愿違

第二天,小菜早早來到公司,昨天自己想基于不可變類實現一個簡單的功能,經過自己不懈的努力,終于“完成”了自己想象的功能,心里也是比較高興的。就等著老王來公司后,給老王看看自己實現的功能。OIj28資訊網——每日最新資訊28at.com

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

老王聽后說:“我看看,你給我簡單說下實現的功能是啥?”。OIj28資訊網——每日最新資訊28at.com

“咱們乘坐高鐵,在進站時不是都要通過身份證檢票嗎,我就想通過不可變類模擬實現一個檢票的功能,這個檢票功能支持并發訪問,也就是同時支持多個人拿著身份證通過檢票。OIj28資訊網——每日最新資訊28at.com

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

“我還畫了一張圖”,說著小菜從電腦里打開了自己畫的場景需求圖,如圖4-1所示。OIj28資訊網——每日最新資訊28at.com

圖片OIj28資訊網——每日最新資訊28at.com

老王聽了后說:“嗯,我大概明白你的需求了,我看看代碼實現”。OIj28資訊網——每日最新資訊28at.com

于是小菜便把電腦給了老王,要不說老王是大牛呢?老王只是用他那凌厲的眼掃了一眼,便說道:“這代碼有問題”。OIj28資訊網——每日最新資訊28at.com

“啊”,小菜當時就有點懵,“這,我覺得沒問題呀”。。。OIj28資訊網——每日最新資訊28at.com

三、分析代碼

“那我們就結合代碼來分析下原因吧”,老王說著,便讓小菜看代碼。“首先是這個User用戶類”。OIj28資訊網——每日最新資訊28at.com

User類的源碼詳見:concurrent-design-patterns-immutable工程下的io.binghe.concurrent.design.demo.wrong.User。OIj28資訊網——每日最新資訊28at.com

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類就是有問題的,你知道什么是不可變類嗎?”,老王問小菜。OIj28資訊網——每日最新資訊28at.com

小菜說:“知道,就是一個類一經創建,就不會發生變化的類,就叫做不可變類”。OIj28資訊網——每日最新資訊28at.com

“對,概念記得倒是挺清楚的,但是這個User類不是一個不可變類呀,我們根據不可變類的定義分析下這個User類為什么不是一個不可變類”,老王巴拉巴拉的說了起來。總體上,老王針對User類為什么不是不可變類,總結了如下幾點:OIj28資訊網——每日最新資訊28at.com

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

“明白了嗎?”,老王問小菜。OIj28資訊網——每日最新資訊28at.com

“明白了”,小菜回答道,“其實我總覺得哪里有點怪,就是說不上來,我以為我寫的是對的”,小菜不好意思的笑了笑。OIj28資訊網——每日最新資訊28at.com

“那我們再來看看你寫的這個TicketCheck類”,老王繼續說道,說著打開了小菜寫的TicketCheck類的代碼片段。OIj28資訊網——每日最新資訊28at.com

TicketCheck類的源碼詳見:concurrent-design-patterns-immutable工程下的io.binghe.concurrent.design.demo.wrong.TicketCheck。OIj28資訊網——每日最新資訊28at.com

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);    }}

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

此時的小菜有點一臉懵逼,眉頭擰成了一個麻花。OIj28資訊網——每日最新資訊28at.com

老王看了一眼小菜,說到:“剛才我說的聽明白了嗎?”。OIj28資訊網——每日最新資訊28at.com

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

“這樣吧,我給你畫張圖分析一下”,老王說道。OIj28資訊網——每日最新資訊28at.com

于是,老王打開了電腦的畫圖工具。。。OIj28資訊網——每日最新資訊28at.com

四、畫圖分析

要不說老王這人就是牛,對其他同事也特別好呢,不一會,就畫出了一張分析圖,如圖4-2所示。OIj28資訊網——每日最新資訊28at.com

圖片OIj28資訊網——每日最新資訊28at.com

“我們就基于你寫的User類進行講解,看這張圖”,老王繼續說到,“假設現在user對象的name為張三,idCard為1001,線程1獲取到用戶信息時,此時的name為張三,idCard為1001,線程1調用user對象的set()方法來修改用戶的信息。我們來看user的set()方法”,老王又打開了User類的代碼,重點讓小菜看set()方法的代碼。OIj28資訊網——每日最新資訊28at.com

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

“在set()方法中,會分別修改user的name字段和idCard的值,這個過程并不是原子操作,線程1在執行set()方法時,在更新完name字段的值時,如果此時恰好發生了線程切換,線程2獲取用戶信息時,獲取到的用戶的name字段為張三,idCard字段為1001。這時,線程2獲取到的數據是錯亂的,線程2獲取到的用戶name字段為李四,idCard卻是張三的身份證編號,用戶數據發生了錯亂的現象,出現了線程安全問題”。OIj28資訊網——每日最新資訊28at.com

“這么說能聽明白嗎?”,老王又問小菜。OIj28資訊網——每日最新資訊28at.com

“嗯,這次明白了”,小菜回復到。OIj28資訊網——每日最新資訊28at.com

“那我們繼續講講怎么寫不可變類的代碼吧”,老王接著說。OIj28資訊網——每日最新資訊28at.com

“好的”。OIj28資訊網——每日最新資訊28at.com

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

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

“好的”,小菜接著說。OIj28資訊網——每日最新資訊28at.com

于是,老王拿著電腦跟產品經理去開會了,小菜回到了自己的工位,開始了一天的工作。。。OIj28資訊網——每日最新資訊28at.com

五、本章總結

本章,以場景故事的形式描述了不可變類存在的線程安全問題,以及對不可變類存在的線程安全問題進行了分析。OIj28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-15436-0.html事與愿違:可變類出現了線程安全問題

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: .Net JIT騷操逆向最新版Dngurad HVM

下一篇: 在Kubernetes中實現gRPC流量負載均衡

標簽:
  • 熱門焦點
  • 6月安卓手機性價比榜:Note 12 Turbo斷層式碾壓

    6月份有一個618,雖然這是京東周年慶的日子,但別的電商也都不約而同的跟進了,反正促銷沒壞處,廠商和用戶都能滿意。618期間一些產品也出現了歷史低價,那么各個價位段的產品性價比
  • 消息稱迪士尼要拍真人版《魔發奇緣》:女主可能也找黑人演員

    8月5日消息,迪士尼確實有點忙,忙著將不少動畫改成真人版,繼《美人魚》后,真人版《白雪公主》、《魔發奇緣》也在路上了。據外媒消息稱,迪士尼將打造真人版
  • 三言兩語說透設計模式的藝術-簡單工廠模式

    一、寫在前面工廠模式是最常見的一種創建型設計模式,通常說的工廠模式指的是工廠方法模式,是使用頻率最高的工廠模式。簡單工廠模式又稱為靜態工廠方法模式,不屬于GoF 23種設計
  • K6:面向開發人員的現代負載測試工具

    K6 是一個開源負載測試工具,可以輕松編寫、運行和分析性能測試。它建立在 Go 和 JavaScript 之上,它被設計為功能強大、可擴展且易于使用。k6 可用于測試各種應用程序,包括 Web
  • 一文看懂為蘋果Vision Pro開發應用程序

    譯者 | 布加迪審校 | 重樓蘋果的Vision Pro是一款混合現實(MR)頭戴設備。Vision Pro結合了虛擬現實(VR)和增強現實(AR)的沉浸感。其高分辨率顯示屏、先進的傳感器和強大的處理能力
  • Flowable工作流引擎的科普與實踐

    一.引言當我們在日常工作和業務中需要進行各種審批流程時,可能會面臨一系列技術和業務上的挑戰。手動處理這些審批流程可能會導致開發成本的增加以及業務復雜度的上升。在這
  • 三萬字盤點 Spring 九大核心基礎功能

    大家好,我是三友~~今天來跟大家聊一聊Spring的9大核心基礎功能。話不多說,先上目錄:圖片友情提示,本文過長,建議收藏,嘿嘿嘿!一、資源管理資源管理是Spring的一個核心的基礎功能,不
  • 從零到英雄:高并發與性能優化的神奇之旅

    作者 | 波哥審校 | 重樓作為公司的架構師或者程序員,你是否曾經為公司的系統在面對高并發和性能瓶頸時感到手足無措或者焦頭爛額呢?筆者在出道那會為此是吃盡了苦頭的,不過也得
  • 華為Mate 60系列用上可變靈動島:正式版體驗將會更出色

    這段時間以來,關于華為新旗艦的爆料日漸密集。據此前多方爆料,今年華為將開始恢復一年雙旗艦戰略,除上半年推出的P60系列外,往年下半年的Mate系列也將
Top 主站蜘蛛池模板: 琼结县| 普陀区| 南和县| 思茅市| 长武县| 资溪县| 禄劝| 科尔| 通渭县| 东兰县| 兰溪市| 西乡县| 莆田市| 绥阳县| 天长市| 环江| 广安市| 珲春市| 崇左市| 唐河县| 常宁市| 中超| 恭城| 剑阁县| 威信县| 桐梓县| 三台县| 胶南市| 枝江市| 庐江县| 铜山县| 绩溪县| 临海市| 盐山县| 瑞丽市| 芦山县| 澎湖县| 昭平县| 张家川| 疏附县| 辉南县|