溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Java中關(guān)于并發(fā)編程的問(wèn)題有哪些

發(fā)布時(shí)間:2022-01-10 09:35:05 來(lái)源:億速云 閱讀:141 作者:iii 欄目:編程語(yǔ)言

本篇內(nèi)容主要講解“Java中關(guān)于并發(fā)編程的問(wèn)題有哪些”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Java中關(guān)于并發(fā)編程的問(wèn)題有哪些”吧!

  為什么需要并發(fā)


  并發(fā)其實(shí)是一種解耦合的策略,它幫助我們把目標(biāo)和時(shí)機(jī)分開(kāi)。這樣做可以明顯改進(jìn)應(yīng)用程序的吞吐量和結(jié)構(gòu)。做過(guò)Java Web開(kāi)發(fā)的人都知道,Java Web中的Servlet程序在Servlet容器的支持下采用單實(shí)例多線(xiàn)程的工作模式,Servlet容器為你處理了并發(fā)問(wèn)題。


  誤解和正解


  常見(jiàn)的對(duì)并發(fā)編程的誤解有以下這些:
  并發(fā)總能改進(jìn)性能(并發(fā)在CPU有很多空閑時(shí)間時(shí)能明顯改進(jìn)程序的性能,但當(dāng)線(xiàn)程數(shù)量較多的時(shí)候,線(xiàn)程間頻繁的調(diào)度切換反而會(huì)讓系統(tǒng)的性能下降) -編寫(xiě)并發(fā)程序無(wú)需修改原有的設(shè)計(jì)(目的與時(shí)機(jī)的解耦往往會(huì)對(duì)系統(tǒng)結(jié)構(gòu)產(chǎn)生巨大的影響) -在使用Web或EJB容器時(shí)不用關(guān)注并發(fā)問(wèn)題(只有了解了容器在做什么,才能更好的使用容器)
  下面的這些說(shuō)法才是對(duì)并發(fā)客觀(guān)的認(rèn)識(shí):
  編寫(xiě)并發(fā)程序會(huì)在代碼上增加額外的開(kāi)銷(xiāo) -正確的并發(fā)是非常復(fù)雜的,即使對(duì)于很簡(jiǎn)單的問(wèn)題 -并發(fā)中的缺陷因?yàn)椴灰字噩F(xiàn)也不容易被發(fā)現(xiàn) -并發(fā)往往需要對(duì)設(shè)計(jì)策略從根本上進(jìn)行修改。


  并發(fā)編程的原則和技巧


  單一職責(zé)原則,分離并發(fā)相關(guān)代碼和其他代碼(并發(fā)相關(guān)代碼有自己的開(kāi)發(fā)、修改和調(diào)優(yōu)生命周期)。
  限制數(shù)據(jù)作用域,兩個(gè)線(xiàn)程修改共享對(duì)象的同一字段時(shí)可能會(huì)相互干擾,導(dǎo)致不可預(yù)期的行為,解決方案之一是構(gòu)造臨界區(qū),但是必須限制臨界區(qū)的數(shù)量。

  使用數(shù)據(jù)副本,數(shù)據(jù)副本是避免共享數(shù)據(jù)的好方法,復(fù)制出來(lái)的對(duì)象只是以只讀的方式對(duì)待。Java 5的java.util.concurrent包中增加一個(gè)名為CopyOnWriteArrayList的類(lèi),它是List接口的子類(lèi)型,所以你可以認(rèn)為它是ArrayList的線(xiàn)程安全的版本,它使用了寫(xiě)時(shí)復(fù)制的方式創(chuàng)建數(shù)據(jù)副本進(jìn)行操作來(lái)避免對(duì)共享數(shù)據(jù)并發(fā)訪(fǎng)問(wèn)而引發(fā)的問(wèn)題。


  線(xiàn)程應(yīng)盡可能獨(dú)立


  讓線(xiàn)程存在于自己的世界中,不與其他線(xiàn)程共享數(shù)據(jù)。有過(guò)Java Web開(kāi)發(fā)經(jīng)驗(yàn)的人都知道,Servlet就是以單實(shí)例多線(xiàn)程的方式工作,和每個(gè)請(qǐng)求相關(guān)的數(shù)據(jù)都是用Servlet子類(lèi)的service方法(或者是doGet或doPost方法)的參數(shù)傳入的。只要Servlet中的代碼只使用局部變量,Servlet就不會(huì)導(dǎo)致同步問(wèn)題。SpringMVC的控制器也是這么做的,從請(qǐng)求中獲得的對(duì)象都是以方法的參數(shù)傳入而不是作為類(lèi)的成員,很明顯Struts 2的做法就正好相反,因此Struts 2中作為控制器的Action類(lèi)都是每個(gè)請(qǐng)求對(duì)應(yīng)一個(gè)實(shí)例。

到此,相信大家對(duì)“Java中關(guān)于并發(fā)編程的問(wèn)題有哪些”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢(xún),關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI