一位Java程式設計師的實際工作情況【面對需求的溝通,問題的解決,值得收藏】

2021-02-13 尚學堂java培訓

今天堂妹子給同學們帶來一個實例,一位Java程式設計師的實際工作情況。

 

實例涉及線程、ReadWriteLoc、synchronized等多個知識點,同時面對需求的溝通與解決,值得同學們收藏。

項目經理今天又接了一個客戶需求,又要折磨我們這些程式設計師屌絲了。這個需求說起來很簡單,做起來非常容易出錯。

先簡單描述一下:

這是一個在線文件編輯器。同一份文件,一個人在讀的時候,其他人不能寫;同理,一個人在寫的時候,其他人也不能讀。也就是說,要麼讀,要麼寫,這兩件事情不能同時進行。

項目經理跟客戶講,「這個很容易實現的,我們是可以做的。」。什麼都可以做,做不出來說是我們程式設計師能力不行,他一點責任都沒有。領導發話了,不管怎麼樣,事情還是要做的。

看了一下需求,有兩個問題,我得先問清楚,否則到時候做得不對,他又把負責推給我,我們項目經理經常搞這些讓我背黑鍋的事情。

「多人同時讀可以嗎?」

「當然可以啦!多少人來讀都沒關係,文件的內容不要變就行。」。

「多人同時寫可以嗎?」

「當然不行啦!你寫別人也會寫,文件不知道以哪份數據為準了。」。

他態度極其惡劣,算了,不跟他計較了,我的項目獎金還在他手裡。趕緊完工,下班了還要回家抱小孩。

根據多年的項目實戰經驗,我寫了一個超牛逼的 Data 類,來封裝文件的數據。看起來是這樣的:


稍微解釋一下:

Data 類中封裝了一個 char 數組類型的 buffer 成員變量。

在構造器中傳入一個 size,表示 buffer 的長度,並在其中創建並初始化這個 buffer,使其每個字符都為「*」。

提供兩個方法,一個負責讀取,另一個負責寫入。在讀取方法中只需遍歷 buffer,將結果不斷 append 到一個 StringBuilder 中,最終將其轉為 String 並返回。

在寫入方法中傳入一個字符,仍然是遍歷 buffer,賦值 buffer 中的每個字符,這樣可以使 buffer 中每個字符都是相同的。

故意在讀寫方法中加入了一個 sleep() 方法,讓程序運行慢一點,模擬比較耗時的操作。而且故意讓寫入比讀取慢一點,因為將 sleep() 方法放入了 write() 方法的循環體中,而 read() 方法卻沒有。

當然了,以上這個示例跑通了,我想項目經理那個需求也不難實現。這也是我們平時做開發的一種習慣,先快速地寫個 Demo 出來,讓領導們看看,技術上走通了,我們再實現具體的需求。

好了,不就是要同時讀寫嗎?這不就是一個典型的多線程使用場景嗎?於是我快速地寫了一個讀取線程,讓它拼命地去讀取 Data 中的數據。


在 ReaderThread 中通過一個死循環去不斷地讀取 Data 中的數據,並將結果列印出來。

再來一個寫入線程,讓它使勁地向 Data 中寫入數據。

一次性可以傳入一個字符串到 WriterThread 中,它將不斷獲取下一個字符(請見 next() 方法),並將該字符寫入 Data 中。

如果讓 ReaderThread 與 WriterThread 同時工作會怎樣?不妨寫了一個簡單的 Client 類運行試試看。

我開啟了 5 個 ReaderThread 與 2 個 WriterThread,模擬讀得多寫得少的情況,並將不同的數據寫入 Data 中。

運行一下!



Thread-1 => AA0A0A00A0

Thread-4 => AA0A0A00A0

Thread-3 => AA0A0A00A0

Thread-2 => AA0A0A00A0

Thread-0 => AA0A0A00A0



為何每次讀取出來的數據不一致呢?應該是輸出 10 個相同的字符才對啊!Data 的 buffer 中每個字符不是應該相同嗎?

如果把這個結果給項目經理看,他肯定要搞死我的。

哦!想到了!在多線程開發中,資源的訪問一定要做到「共享互斥」,也就是說要「上鎖」,這招還是架構師前幾天才教我的,我怎能不用?

於是我用了 Java 多線程中超牛逼的 synchronized 關鍵字,將它放到了 read() 與 write() 方法上,這樣就可以保證 synchronized 方法在同一時刻只能被一個線程調用了,其他線程將會阻擋在外。

廢話少說,趕緊加兩個 synchronized 運行看看吧。

再運行一把!



Thread-0 => 1111111111

Thread-4 => CCCCCCCCCC

Thread-3 => CCCCCCCCCC

Thread-2 => CCCCCCCCCC

Thread-1 => CCCCCCCCCC



終於搞定啦!這下子項目經理應該滿意了吧?

「不錯!這效果很好啊,同時寫同時讀,而且每次讀出來的數據都一樣,技術上應該是走通了,這個需求應該可以實現了吧?」 項目經理問。

「沒問題啊!小意思!」 我高興的答。

「這是一個在線文件編輯器,你考慮過性能問題嗎?」 架構師突然問了一句。

「性能很好啊!」

「你可以在 ReaderThread 中每調用 10 次 read() 方法,就列印 1 次所耗時間看看。」

「好啊!」

這還不簡單,我快速地給 ReaderThread 的 run() 方法中加了幾行代碼,測試一下運行所消耗的時間。

跑起來吧!

Thread-2 => IIIIIIIIII

Thread-2 — 24802ms

Thread-3 => IIIIIIIIII

Thread-3 — 24901ms

Thread-4 => IIIIIIIIII

Thread-4 — 25001ms

Thread-0 => 3333333333

Thread-0 => 1111111111

Thread-0 — 55305ms

Thread-4 => CCCCCCCCCC

Thread-3 => CCCCCCCCCC

Thread-2 => CCCCCCCCCC

Thread-1 => CCCCCCCCCC

Thread-1 — 58705ms

Thread-2 => CCCCCCCCCC

我隨意挑選了其中這 5 個 ReaderThread 所消耗的時間,平均值是:37742.8 毫秒,折合 37.8 秒。

我心裡也沒譜了,這性能到底是否需要優化呢?於是我帶著測試結果,去向架構師請教。

他看到了這樣的結果,微笑著搖了搖頭。從他鄙視而又猥瑣的表情上,我可以推測,這次他又要在我面前露一手了。

來吧,我給你寫一個 ReadWriteLock,你自己去看吧。

隨後,架構師用他熟練的手指,瘋狂地在鍵盤上敲了一堆讓我一知半解的東西。



我看出來了,架構師特意寫了很多注釋,免得我總是去煩他。

代碼不解釋了,看看注釋吧,有疑問可以給我留言哦!

此時,Data 類還需要稍作改寫。

同樣的 Client 類,我再運行一把試試看,性能是否有提高呢?



Thread-1 => 4444444444

Thread-2 — 14000ms

Thread-0 — 14001ms

Thread-3 — 14000ms

Thread-4 — 14000ms

Thread-1 — 14001ms

Thread-4 => IIIIIIIIII



平均下來是 14000.4 毫秒,折合 14.0 秒,比以前快了 63%,而且輸出的結果都比以前平穩(以前忽高忽低的)。

果然是架構師,真讓我們這些程式設計師崇拜啊!

最後架構師過來,看到我在那裡得意地笑。他拍拍我的肩,對我說:「別樂了,其實 JDK 1.5 中已經有 ReadWriteLock 了,我這個只不過是一個精簡版而已,去看看 java.util.concurrent.locks.ReadWriteLock 吧,你一定會震精!」。

看來我真是孤陋寡聞啊,打開 JDK API 看到了 ReadWriteLock:

可以通過 ReadWriteLock 接口來獲取 ReadLock 與 WriteLock,它們都是 Lock 對象,這也是一個接口。

官方提供了一個 ReadWriteLock 接口的實現類 java.util.concurrent.locks.ReentrantReadWriteLock。

該接口中,有兩個非常重要的方法:lock() 與 unlock(),分別表示「上鎖」與「解鎖」。

嘗試用一下 JDK 的 ReadWriteLock 吧。

再次運行一把看看效果。

使用了 JDK 的 ReadWriteLock,性能與自己實現的 ReadWriteLock 差不多,大家不妨自己試一下吧。

此外 JDK 還提供了一個更加簡單的 ReentrantLock,它可以取代 synchronized,確保獲取更高的吞吐率,一般可以這樣來做:

以前的做法:

現在的做法:

這裡提供兩張 synchronized 與 Lock 的性能測試對比:



總結

當系統中出現不同的讀寫線程同時訪問某一資源時,需要考慮共享互斥問題,可使用 synchronized 解決次問題。若對性能要求較高的情況下,可考慮使用 ReadWriteLock 接口及其 ReentrantReadWriteLock 實現類,當然,自己實現一個 ReadWriteLock 也是一種解決方案。此外,為了在高並發情況下獲取較高的吞吐率,建議使用 Lock 接口及其 ReentrantLock 實現類來替換以前的 synchronized 方法或代碼塊。

以這個實例為拋磚引玉,同學們自己在學習過程或工作過程中,是如何處理的,值得同學們思考。

 

尚學堂Java培訓開課時間表

西安校區

Android高薪就業班:

脫產班】開課時間:已開班  座中..  

周末班】開課時間:已開班  座中.. 

電話:029-62258374  029-62326079

地址:陝西省西安市高新區科技二路西安軟體園天澤大廈五樓

鄭州校區

Android全程就業班

脫產班】 開課時間:2017年03月28日  搶座中..

電話:0371-58500958

地址:河南省鄭州市金水區東風路與文化路交叉南100米

什麼是脫產班:

脫產班就是參加工作後再去校內進行學習

一種學習方式。其管理模式與高校普通班

級一樣,學習期間完全脫離生產不在原單

位工作,全身心的進行全日制學習。不佔

用學生周六和周日的工作時間,對學生有

正常的、相對固定的授課教室和管理要求

,有穩定的寒暑假安排。

一個有用的公眾號

尚學堂java培訓

     Android

     web前端

     培訓基地

親愛的同學們:

      尚學堂java培訓開班前有免費試聽課程,想學習又不太確定的同學們趕緊聯繫老師,獲取免費試聽名額(每個班級的名額是有限的哦,速聯速得)。

    獲取方式:打開【尚學堂java培訓】公眾號,點擊-精品課程-我要試聽-聯繫老師獲取免費試聽名額;或直接聯繫公眾號,讓「萬能」的小編為您解決一切問題!

相關焦點

  • Java程式設計師幾年能實現月薪2萬,需要具備哪些技能?
    業務抽象就是對需求進行分析後,能夠建立完美的實體類以及他們之間的聯繫。技術抽象是對整體架構進行一個分層,各層之間的交互。這至關重要,如果技術抽象能力不足,這會導致整個系統的架構不靈活,難以維護和擴展。知識的深度:至少是某個領域的專家,比如消息隊列,activeMQ熟悉其源碼,知道其實現。優秀的學習能力:對新的技術和前沿性的技術進行學習,使用它來解決工作中的業務問題。
  • 面試感悟:3年工作經驗java程式設計師應有的技能
    關於項目經驗,我認為並發編程網的創始人方騰飛老師講的一段話非常好:介紹產品時面試官會考察應聘者的溝通能力和思考能力,我們大部分情況都是做產品的一個功能或一個模塊,但是即使是這樣,自己有沒有把整個系統架構或產品搞清楚,並能介紹清楚,為什麼做這個系統?這個系統的價值是什麼?這個系統有哪些功能?優缺點有哪些?如果讓你重新設計這個系統你會如何設計?
  • 開課吧:Java程式設計師發展前景怎麼樣難不難?Java用人需求量分析!
    程式設計師是一個行業,無論是java程式設計師還是Python程式設計師等,在這裡java和python只是一種開發工具。想要學好一門開發語言,最重要也最核心的是其編程思想,例如java是一門面向對象的開發語言,那麼什麼是對象?
  • 為什麼很多java程式設計師都不喜歡PHP程式設計師?
    為什麼很多java程式設計師都不喜歡PHP程式設計師?這不是引戰的標題,小編是根據身邊很多程式設計師講述,特別是比較喜歡java程式設計師而總結出來的。在工作中,很多公司隨著業務的增加與需求多樣性,有些企業就是要求用PHP開發,所以很多開發公司都是跟著市場走,主流的程式語言java與PHP碰面,多數情況下java程式設計師都不喜歡PHP程式設計師。
  • 一位工作8年程式設計師的成長感悟,值得深思
    在做程式設計師前,早就聽老師說過,程式設計師最關鍵的是解決問題,甭管你之前學沒學過,只要在你職責範圍內有需求,你都得想法設法把問題處理。03職場上,請牢記,解決問題是我們的義務。公司請我們來的目的只有一個,解決問題。對於領導安排的工作,千萬不要說「我不會」、「我做不到」類似這樣的話。
  • 如何使Java程式設計師擁有高效率的開發環境
    如何使Java程式設計師擁有高效率的開發環境 作為一名程式設計師,好的開發環境可以提升你的工作效率,事半功倍。那麼一名Java程式設計師應該擁有什麼樣的開發工具呢。
  • Java程式設計師的4個職業發展方向,該如何把握黃金5年?
    這個時候提高自己的影響力主要是可以給自己創造更多的機會,所以,這個階段最大的任務是提高自己的影響力,為未來工作生涯做準備。對於軟體開發同學而言,首先要客觀認識自身的情況,想清楚自己現在要什麼、未來要什麼,做好職業規劃,從而選擇不同類型的企業。架構師,是Java開發人員非常嚮往的一個角色。
  • Java 程式設計師必讀的 9 本書
    連結:https://hackernoon.com/10-best-java-books-for-beginners-and-advanced-developers-z27r3wvs如果你一名Java程式設計師,並且想知道如何通過閱讀書籍來提高自己的Java技能水平,那你今天算是來對地方了,在本文,我將分享一些有史以來我讀過的最好的Java書籍,這些書籍非但沒有因為時間的流逝而過時
  • 作為一個Java 程式設計師 你應該會什麼
    4、API:Java 的核心API 是非常龐大的,但是有一些內容筆者認為是Java程式設計師必須熟悉的,否則不可能熟練的運用Java,包括:◆java.lang 包下的80%以上的類的功能的靈活運用。6、管理:Java 程式設計師必須熟悉使用ant 完成工程管理的常用任務,例如工程編譯、生成javadoc、生成jar、版本控制、自動測試。7、排錯:應該可以根據異常信息比較快速的定位問題的原因和大致位置。8、思想:必須掌握OOP 的主要要求,這樣使用Java 開發的系統才能是真正的Java 系統。
  • Java程式設計師憑什麼工資那麼高?
    首先,我們看一下有關調查統計的數據:相信大家都能看得出Java程式設計師的在這些行業中的工資待遇確實很高,引起大家羨慕不已,甚至很多人因為它的高收入而去轉行。那為什麼Java程式設計師的工資這麼高?接下來我們詳細分析一下。
  • 程式設計師如何面對產品經理的無理要求
    在項目開發的過程中,程式設計師往往對產品經理的各種無理要求十分頭疼,有的程式設計師需要頻繁的跟產品經理講解目前的技術邊界,這樣既影響了項目的正常進展,也會讓程式設計師感覺沒有明確的方向,從而帶來工作的挫敗感。有的程式設計師與產品經理的關係也比較緊張,溝通的過程往往也帶著各種情緒。
  • 28歲轉行程式設計師,學Java還是Python?碼農:想快點月薪過萬就選它
    身邊也有很多人問我轉行程式設計師難不難,快三十歲了轉行還有沒有戲,對此我的回答都是歡迎轉行程式設計師,程式設計師雖說門檻有點高,但其實並不難。只要熱情能堅持一兩個月基本上就可以了。現在大環境的改變,很多人學編程都直接開始選擇Python,學java 的越來越少。不是說哪種語言好壞,如果要討論哪種語言好的話,還是請各位理性討論。
  • SUN JAVA程式設計師和開發員(SCJD)認證
    java程式設計師認證考試考試號為310-025。Java程式設計師的認證考試以Sun公司的SL-275英文原版教材為標準,需要掌握並作為考試內容的知識點有:聲明和權限控制,流控制和異常處理,垃圾回收機制,基本語法,操作數和符號,重載、覆蓋、運行類型和面向對象,線程等;此外,還有java.awt、java.lang、java.util、java.io包中的常用類等。 javaSL-275的考試共有試題59道,通過分數為61分(答對36道題即可)。
  • 工作三年的Java程式設計師該怎麼擺脫迷茫?
    程式設計師從開始選擇到堅持下去,工作了三年對一個程式設計師意味什麼?在職位上:高級開發工程師?架構師?技術經理?or ... ?在能力上:各種編碼無壓力?核心代碼無壓力?平臺架構無壓力?看著這些問號都心累。相同三年,不同程式設計師卻走在了不同的路線,有些能在三年成為架構師,有些卻還是程式設計師,不是工作年限加長而已,那麼,三年你迷惘了嗎?
  • (面試感悟)一名3年工作經驗的程式設計師應該具備的技能
    這篇文章大部分內容都是面向整個程式設計師群體的,當然因為LZ本身是做java開發的,因此有一部分內容也是專門面向咱們java程式設計師的。面試完LZ多方了解了一下,對方認為我基本功什麼的都不錯,但是實際項目經驗還是欠缺一些,因為對方是創業型公司,需要人上手就能幹活,因此我在這個時候還不是特別適合他們團隊至於其他成功的四家公司,給LZ的面試評價都挺高的貌似,但LZ也不想記流水帳,因此就不一一列舉每家公司的面試過程了,下面LZ主要談談作為一名工作三年左右的java程式設計師應該具備的一些技能以及個人的一些其他感悟。
  • 給Java程式設計師的20個鍊表面試題
    如何在面試中解決鍊表編程問題?為了解決基於鍊表的問題,有必要充分了解遞歸,因為鍊表就是一個遞歸數據結構。如果從鍊表中取一個節點,剩餘數據結構仍然構成一個鍊表。也正是因此,許多鍊表問題的遞歸解決方案比迭代解決方案更加簡單。這些問題也可以用分而治之的技巧解決,將一個問題分成多個子問題,直到能完全解決它們。
  • 為什麼java程式設計師的年薪有40W,我來告訴你答案
    當然一個應屆畢業生剛剛進入公司一般工資不會太高,但是程式設計師的工資是隨著工作時間越長越高,當然還有靠自己的努力。如果你也想在IT行業拿高薪,可以參加我們的訓練營課程,選擇最適合自己的課程學習,技術大牛親授,7個月後,進入名企拿高薪。我們的課程內容有:Java工程化、高性能及分布式、高性能、深入淺出。高架構。
  • Java和C/C++的區別是什麼?java高級程式設計師的未來發展是怎樣的?
    java高級程式設計師的未來發展是怎樣的ne一、java高級程式設計師和C/C++有什麼區別>java高級程式設計師和C/C++有什麼區別?大數據獵頭認為,熟悉C語言和C++語言的人肯定比任何人都想弄明白這個問題,事實上,java裡面帶有很多C語言和C++語言的成份,可以說java就是由C語言發展所衍生的來的。
  • 3年的java程式設計師,歷經3月7輪面試入職阿里,最後薪資意外
    最近有一名java程式設計師,成功拿到了阿里雲的offer, p6的java開發崗,這本來算是一件可喜可賀的事情,可是這名java程式設計師怎麼也高興不起來,並且還是相當的糾結,這是為什麼呢?,況且我想這三個月來這名程式設計師沒少請假,在上家公司的狀態也不會好到哪裡去,也許領導已經看出問題,只不過沒說罷了,如果繼續呆在上家公司也不是很好,這讓他陷入兩難境地。
  • 黑馬程式設計師java培訓機構如何?好口碑java培訓機構如何選?
    大大小小的Java培訓機構多如牛毛,幾個人經過簡單的包裝就會成為精英人士混淆視聽,因此想要知道黑馬程式設計師java培訓機構如何?好口碑java培訓機構如何選?我們就要考全面慮。想要知道一家java培訓機構好不好,品牌和實力是最為重要的,實力如何就要看師資力量了,擁有豐富實戰經驗的導師會結合學員過往的工作經歷、學習表現、階段性成績、項目成績等,為學員提供最佳的專業輔導。課程安排方面會凸顯這家java培訓機構的專業,畢竟專注的總歸是專業的,java培訓起來理論必須加實踐,因為最終的目的是打造符合企業需求的java人才。