日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

你知道如何用面向对象思想写好并发编程吗?

發(fā)布時間:2023/11/30 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 你知道如何用面向对象思想写好并发编程吗? 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在工作中,我發(fā)現(xiàn)很多人在設計之初都是直接按照單線程的思路來寫程序的,而忽略了本應該重視的并發(fā)問題;等上線后的某天,突然發(fā)現(xiàn)詭異的 Bug,再歷經(jīng)千辛萬苦終于定位到問題所在,卻發(fā)現(xiàn)對于如何解決已經(jīng)沒有了思路。

關于這個問題,我覺得咱們今天很有必要好好聊聊“如何用面向?qū)ο笏枷雽懞貌l(fā)程序”這個話題。

面向?qū)ο笏枷肱c并發(fā)編程有關系嗎?本來是沒關系的,它們分屬兩個不同的領域,但是在 Java 語言里,這兩個領域被無情地融合在一起了,好在融合的效果還是不錯的:在 Java 語言里,面向?qū)ο笏枷肽軌蜃尣l(fā)編程變得更簡單。

那如何才能用面向?qū)ο笏枷雽懞貌l(fā)程序呢?結合我自己的工作經(jīng)驗來看,我覺得你可以從封裝共享變量識別共享變量間的約束條件制定并發(fā)訪問策略這三個方面下手。

一、封裝共享變量

并發(fā)程序,我們關注的一個核心問題,不過是解決多線程同時訪問共享變量的問題。

面向?qū)ο笏枷肜锩嬗幸粋€很重要的特性是封裝,封裝的通俗解釋就是將屬性和實現(xiàn)細節(jié)封裝在對象內(nèi)部,外界對象只能通過目標對象提供的公共方法來間接訪問這些內(nèi)部屬性,這和門票管理模型匹配度相當?shù)母?#xff0c;球場里的座位就是對象屬性,球場入口就是對象的公共方法。我們把共享變量作為對象的屬性,那對于共享變量的訪問路徑就是對象的公共方法,所有入口都要安排檢票程序就相當于我們前面提到的并發(fā)訪問策略。

利用面向?qū)ο笏枷雽懖l(fā)程序的思路,其實就這么簡單:將共享變量作為對象屬性封裝在內(nèi)部,對所有公共方法制定并發(fā)訪問策略。 就拿很多統(tǒng)計程序都要用到計數(shù)器來說,下面的計數(shù)器程序共享變量只有一個,就是 value,我們把它作為 Counter 類的屬性,并且將兩個公共方法 get() 和 addOne() 聲明為同步方法,這樣 Counter 類就成為一個線程安全的類了。

public class Counter {private long value;synchronized long get(){return value;}synchronized long addOne(){return ++value;} }

當然,實際工作中,很多的場景都不會像計數(shù)器這么簡單,經(jīng)常要面臨的情況往往是有很多的共享變量,例如,信用卡賬戶有卡號、姓名、身份證、信用額度、已出賬單、未出賬單等很多共享變量。這么多的共享變量,如果每一個都考慮它的并發(fā)安全問題,那我們就累死了。但其實仔細觀察,你會發(fā)現(xiàn),很多共享變量的值是不會變的,例如信用卡賬戶的卡號、姓名、身份證。對于這些不會發(fā)生變化的共享變量,建議你用 final 關鍵字來修飾。 這樣既能避免并發(fā)問題,也能很明了地表明你的設計意圖,讓后面接手你程序的兄弟知道,你已經(jīng)考慮過這些共享變量的并發(fā)安全問題了。

二、識別共享變量間的約束條件

識別共享變量間的約束條件非常重要。因為這些約束條件,決定了并發(fā)訪問策略。 例如,庫存管理里面有個合理庫存的概念,庫存量不能太高,也不能太低,它有一個上限和一個下限。關于這些約束條件,我們可以用下面的程序來模擬一下。在類 SafeWM 中,聲明了兩個成員變量 upper 和 lower,分別代表庫存上限和庫存下限,這兩個變量用了 AtomicLong 這個原子類,原子類是線程安全的,所以這兩個成員變量的 set 方法就不需要同步了。

public class SafeWM {// 庫存上限private final AtomicLong upper = new AtomicLong(0);// 庫存下限private final AtomicLong lower = new AtomicLong(0);// 設置庫存上限void setUpper(long v){upper.set(v);}// 設置庫存下限void setLower(long v){lower.set(v);}// 省略其他業(yè)務代碼 }

雖說上面的代碼是沒有問題的,但是忽視了一個約束條件,就是庫存下限要小于庫存上限,這個約束條件能夠直接加到上面的 set 方法上嗎?我們先直接加一下看看效果(如下面代碼所示)。我們在 setUpper() 和 setLower() 中增加了參數(shù)校驗,這乍看上去好像是對的,但其實存在并發(fā)問題,問題在于存在競態(tài)條件。這里我順便插一句,其實當你看到代碼里出現(xiàn) if 語句的時候,就應該立刻意識到可能存在競態(tài)條件。

我們假設庫存的下限和上限分別是 (2,10),線程 A 調(diào)用 setUpper(5) 將上限設置為 5,線程 B 調(diào)用 setLower(7) 將下限設置為 7,如果線程 A 和線程 B 完全同時執(zhí)行,你會發(fā)現(xiàn)線程 A 能夠通過參數(shù)校驗,因為這個時候,下限還沒有被線程 B 設置,還是 2,而 5>2;線程 B 也能夠通過參數(shù)校驗,因為這個時候,上限還沒有被線程 A 設置,還是 10,而 7<10。當線程 A 和線程 B 都通過參數(shù)校驗后,就把庫存的下限和上限設置成 (7, 5) 了,顯然此時的結果是不符合庫存下限要小于庫存上限這個約束條件的。

public class SafeWM {// 庫存上限private final AtomicLong upper = new AtomicLong(0);// 庫存下限private final AtomicLong lower = new AtomicLong(0);// 設置庫存上限void setUpper(long v){// 檢查參數(shù)合法性if (v < lower.get()) {throw new IllegalArgumentException();}upper.set(v);}// 設置庫存下限void setLower(long v){// 檢查參數(shù)合法性if (v > upper.get()) {throw new IllegalArgumentException();}lower.set(v);}// 省略其他業(yè)務代碼 }

在沒有識別出庫存下限要小于庫存上限這個約束條件之前,我們制定的并發(fā)訪問策略是利用原子類,但是這個策略,完全不能保證庫存下限要小于庫存上限這個約束條件。所以說,在設計階段,我們一定要識別出所有共享變量之間的約束條件,如果約束條件識別不足,很可能導致制定的并發(fā)訪問策略南轅北轍。

共享變量之間的約束條件,反映在代碼里,基本上都會有 if 語句,所以,一定要特別注意競態(tài)條件。

三、制定并發(fā)訪問策略

制定并發(fā)訪問策略,是一個非常復雜的事情。應該說整個專欄都是在嘗試搞定它。不過從方案上來看,無外乎就是以下“三件事”。

  • 避免共享:避免共享的技術主要是利于線程本地存儲以及為每個任務分配獨立的線程。
  • 不變模式:這個在 Java 領域應用的很少,但在其他領域卻有著廣泛的應用,例如 Actor 模式、CSP 模式以及函數(shù)式編程的基礎都是不變模式。
  • 管程及其他同步工具:Java 領域萬能的解決方案是管程,但是對于很多特定場景,使用 Java 并發(fā)包提供的讀寫鎖、并發(fā)容器等同步工具會更好。
  • 接下來在咱們專欄的第二模塊我會仔細講解 Java 并發(fā)工具類以及他們的應用場景,在第三模塊我還會講解并發(fā)編程的設計模式,這些都是和制定并發(fā)訪問策略有關的。

    除了這些方案之外,還有一些宏觀的原則需要你了解。這些宏觀原則,有助于你寫出“健壯”的并發(fā)程序。這些原則主要有以下三條。

  • 優(yōu)先使用成熟的工具類:Java SDK 并發(fā)包里提供了豐富的工具類,基本上能滿足你日常的需要,建議你熟悉它們,用好它們,而不是自己再“發(fā)明輪子”,畢竟并發(fā)工具類不是隨隨便便就能發(fā)明成功的。
  • 迫不得已時才使用低級的同步原語:低級的同步原語主要指的是 synchronized、Lock、Semaphore 等,這些雖然感覺簡單,但實際上并沒那么簡單,一定要小心使用。
  • 避免過早優(yōu)化:安全第一,并發(fā)程序首先要保證安全,出現(xiàn)性能瓶頸后再優(yōu)化。在設計期和開發(fā)期,很多人經(jīng)常會情不自禁地預估性能的瓶頸,并對此實施優(yōu)化,但殘酷的現(xiàn)實卻是:性能瓶頸不是你想預估就能預估的。
  • 總結

    寫在最后

    很多人感嘆“學習無用”,實際上之所以產(chǎn)生無用論,是因為自己想要的與自己所學的匹配不上,這也就意味著自己學得遠遠不夠。無論是學習還是工作,都應該有主動性,所以如果擁有大廠夢,那么就要自己努力去實現(xiàn)它。

    以上學習資料均免費放送,最后祝愿各位身體健康,順利拿到心儀的offer!

    由于文章的篇幅有限,所以這次的螞蟻金服和京東面試題答案整理在了PDF文檔里

    資料獲取方式:點贊+評論我的文章,關注我,然后戳這里即可免費領取

    CuqNXO-1623614570590)]

    [外鏈圖片轉存中…(img-dlpWA0LK-1623614570592)]

    [外鏈圖片轉存中…(img-mswpUISq-1623614570593)]

    總結

    以上是生活随笔為你收集整理的你知道如何用面向对象思想写好并发编程吗?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 日韩欧美天堂 | 国产精品成人在线观看 | 先锋资源久久 | 禁网站在线观看免费视频 | 九热视频在线观看 | 91入囗| 午夜在线国产 | 白浆av| 国产一二三 | 97影院手机版 | 欧美一二三| 欧美成人精品在线观看 | 最近的中文字幕 | 免费在线观看成人av | 久久人人视频 | 成人激情综合网 | 国产精品aaa| 精东传媒在线观看 | 丰满少妇熟乱xxxxx视频 | 国产肉体xxxx裸体784大胆 | 亚洲欧美日韩一区在线观看 | 亚洲精品国产成人久久av盗摄 | 日本在线免费视频 | 农村黄色片| 377p粉嫩大胆色噜噜噜 | 日韩欧美国产另类 | 久草视频在线免费播放 | 狠狠操在线视频 | 玖玖网| 动漫美女舌吻 | 日本不卡视频一区二区 | 免费看h网站 | 婷婷久久久久久 | 日本中文字幕影院 | 国产精彩视频在线 | 国产一区二区三区视频播放 | 在线观看中文字幕亚洲 | 99看片| 欧美一级片在线观看 | 小明天天看 | 很污很黄的网站 | 国产一区二区不卡在线 | 一起操网站 | 国产视频三级 | 狠狠干干干 | 亚洲一级特黄毛片 | 91亚洲视频在线 | 中文字幕在线观看你懂的 | 中文字幕国产专区 | 国产美女精品视频 | 金鱼妻日剧免费观看完整版全集 | 色哟哟av | 亚洲成人黄色小说 | 桃色视屏 | 人禽l交视频在线播放 视频 | 中文字幕2区 | 天天看天天干 | 日韩视频在线观看一区二区 | 国产精品视频一区二区三区在3 | 欧美一级片在线免费观看 | 欧美一级夜夜爽 | 国产大学生av | 人人艹视频 | 国产一级自拍 | 97少妇| 婷婷国产精品 | 亚洲欧美一区二区三区四区五区 | 先锋资源国产 | 95看片淫黄大片一级 | 超污视频在线观看 | 91精品国产色综合久久不8 | 解开乳罩喂领导吃奶 | av观看一区 | 操三八男人的天堂 | 伊人av在线 | 午夜在线观看免费视频 | 日韩一区二区三区精 | 日韩欧美亚洲国产 | 在线观看深夜视频 | 国产精品久久久久久久免费看 | 国产成人无码网站 | 色屁屁网站 | a一级视频| 久久久久亚洲精品 | 波多野久久 | 国产又粗又长又硬免费视频 | 欧洲亚洲激情 | 国产人妻人伦精品1国产 | 欧美18—19性高清hd4k | 女女爱爱视频 | 在线视频国产一区 | 久久国产夫妻 | a一级黄色片 | 秋霞二区| 好男人www在线视频 我们的2018在线观看免费高清 | 亚洲av无码一区二区三区在线播放 | 日本h漫在线观看 | 韩国久久久 | 国产免费黄色网址 |