您好,登錄后才能下訂單哦!
本篇內容主要講解“Java中關于并發編程的問題有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Java中關于并發編程的問題有哪些”吧!
為什么需要并發
并發其實是一種解耦合的策略,它幫助我們把目標和時機分開。這樣做可以明顯改進應用程序的吞吐量和結構。做過Java Web開發的人都知道,Java Web中的Servlet程序在Servlet容器的支持下采用單實例多線程的工作模式,Servlet容器為你處理了并發問題。
誤解和正解
常見的對并發編程的誤解有以下這些:
并發總能改進性能(并發在CPU有很多空閑時間時能明顯改進程序的性能,但當線程數量較多的時候,線程間頻繁的調度切換反而會讓系統的性能下降) -編寫并發程序無需修改原有的設計(目的與時機的解耦往往會對系統結構產生巨大的影響) -在使用Web或EJB容器時不用關注并發問題(只有了解了容器在做什么,才能更好的使用容器)
下面的這些說法才是對并發客觀的認識:
編寫并發程序會在代碼上增加額外的開銷 -正確的并發是非常復雜的,即使對于很簡單的問題 -并發中的缺陷因為不易重現也不容易被發現 -并發往往需要對設計策略從根本上進行修改。
并發編程的原則和技巧
單一職責原則,分離并發相關代碼和其他代碼(并發相關代碼有自己的開發、修改和調優生命周期)。
限制數據作用域,兩個線程修改共享對象的同一字段時可能會相互干擾,導致不可預期的行為,解決方案之一是構造臨界區,但是必須限制臨界區的數量。
使用數據副本,數據副本是避免共享數據的好方法,復制出來的對象只是以只讀的方式對待。Java 5的java.util.concurrent包中增加一個名為CopyOnWriteArrayList的類,它是List接口的子類型,所以你可以認為它是ArrayList的線程安全的版本,它使用了寫時復制的方式創建數據副本進行操作來避免對共享數據并發訪問而引發的問題。
線程應盡可能獨立
讓線程存在于自己的世界中,不與其他線程共享數據。有過Java Web開發經驗的人都知道,Servlet就是以單實例多線程的方式工作,和每個請求相關的數據都是用Servlet子類的service方法(或者是doGet或doPost方法)的參數傳入的。只要Servlet中的代碼只使用局部變量,Servlet就不會導致同步問題。SpringMVC的控制器也是這么做的,從請求中獲得的對象都是以方法的參數傳入而不是作為類的成員,很明顯Struts 2的做法就正好相反,因此Struts 2中作為控制器的Action類都是每個請求對應一個實例。
到此,相信大家對“Java中關于并發編程的問題有哪些”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。