電子商務(wù)網(wǎng)站建設(shè)關(guān)于JAVA開發(fā)
針對電子商務(wù)網(wǎng)站建設(shè),我們會有不同的語言進(jìn)行開發(fā),其中PHP,.net,Java是現(xiàn)在都比較熱門的開發(fā)程序語言,那么接下來我們就來分析下JAVA語言開發(fā),電子商務(wù)網(wǎng)站建設(shè)關(guān)于JAVA開發(fā)。
為什么需要并發(fā)
并發(fā)其實是一種解耦合的策略,它幫助我們把做什么(目標(biāo))和什么時候做(時機)分開。這樣做可以明顯改進(jìn)應(yīng)用程序的吞吐量(獲得更多的CPU調(diào)度時間)和結(jié)構(gòu)(程序有多個部分在協(xié)同工作)。做過Java Web開發(fā)的人都知道,Java Web中的Servlet程序在Servlet容器的支持下采用單實例多線程的工作模式,Servlet容器為你處理了并發(fā)問題。
誤解和正解
最常見的對并發(fā)編程的誤解有以下這些:
并發(fā)總能改進(jìn)性能(并發(fā)在CPU有很多空閑時間時能明顯改進(jìn)程序的性能,但當(dāng)線程數(shù)量較多的時候,線程間頻繁的調(diào)度切換反而會讓系統(tǒng)的性能下降)
編寫并發(fā)程序無需修改原有的設(shè)計(目的與時機的解耦往往會對系統(tǒng)結(jié)構(gòu)產(chǎn)生巨大的影響)
在使用Web或EJB容器時不用關(guān)注并發(fā)問題(只有了解了容器在做什么,才能更好的使用容器)
下面的這些說法才是對并發(fā)客觀的認(rèn)識:
編寫并發(fā)程序會在代碼上增加額外的開銷
正確的并發(fā)是非常復(fù)雜的,即使對于很簡單的問題
并發(fā)中的缺陷因為不易重現(xiàn)也不容易被發(fā)現(xiàn)
并發(fā)往往需要對設(shè)計策略從根本上進(jìn)行修改
并發(fā)編程的原則和技巧
單一職責(zé)原則
分離并發(fā)相關(guān)代碼和其他代碼(并發(fā)相關(guān)代碼有自己的開發(fā)、修改和調(diào)優(yōu)生命周期)。
限制數(shù)據(jù)作用域
兩個線程修改共享對象的同一字段時可能會相互干擾,導(dǎo)致不可預(yù)期的行為,解決方案之一是構(gòu)造臨界區(qū),但是必須限制臨界區(qū)的數(shù)量。
使用數(shù)據(jù)副本
數(shù)據(jù)副本是避免共享數(shù)據(jù)的好方法,復(fù)制出來的對象只是以只讀的方式對待。Java 5的java.util.concurrent包中增加一個名為CopyOnWriteArrayList的類,它是List接口的子類型,所以你可以認(rèn)為它是ArrayList的線程安全的版本,它使用了寫時復(fù)制的方式創(chuàng)建數(shù)據(jù)副本進(jìn)行操作來避免對共享數(shù)據(jù)并發(fā)訪問而引發(fā)的問題。
線程應(yīng)盡可能獨立
讓線程存在于自己的世界中,不與其他線程共享數(shù)據(jù)。有過Java Web開發(fā)經(jīng)驗的人都知道,Servlet就是以單實例多線程的方式工作,和每個請求相關(guān)的數(shù)據(jù)都是通過Servlet子類的service方法(或者是doGet或doPost方法)的參數(shù)傳入的。只要Servlet中的代碼只使用局部變量,Servlet就不會導(dǎo)致同步問題。springMVC的控制器也是這么做的,從請求中獲得的對象都是以方法的參數(shù)傳入而不是作為類的成員,很明顯Struts 2的做法就正好相反,因此Struts 2中作為控制器的Action類都是每個請求對應(yīng)一個實例。
Java 5以前的并發(fā)編程
Java的線程模型建立在搶占式線程調(diào)度的基礎(chǔ)上,也就是說:
所有線程可以很容易的共享同一進(jìn)程中的對象。
能夠引用這些對象的任何線程都可以修改這些對象。
為了保護(hù)數(shù)據(jù),對象可以被鎖住。
Java基于線程和鎖的并發(fā)過于底層,而且使用鎖很多時候都是很萬惡的,因為它相當(dāng)于讓所有的并發(fā)都變成了排隊等待。
在Java 5以前,可以用synchronized關(guān)鍵字來實現(xiàn)鎖的功能,它可以用在代碼塊和方法上,表示在執(zhí)行整個代碼塊或方法之前線程必須取得合適的鎖。對于類的非靜態(tài)方法(成員方法)而言,這意味這要取得對象實例的鎖,對于類的靜態(tài)方法(類方法)而言,要取得類的Class對象的鎖,對于同步代碼塊,程序員可以指定要取得的是那個對象的鎖。
不管是同步代碼塊還是同步方法,每次只有一個線程可以進(jìn)入,如果其他線程試圖進(jìn)入(不管是同一同步塊還是不同的同步塊),JVM會將它們掛起(放入到等鎖池中)。這種結(jié)構(gòu)在并發(fā)理論中稱為臨界區(qū)(critical section)。這里我們可以對Java中用synchronized實現(xiàn)同步和鎖的功能做一個總結(jié):
只能鎖定對象,不能鎖定基本數(shù)據(jù)類型
被鎖定的對象數(shù)組中的單個對象不會被鎖定
同步方法可以視為包含整個方法的synchronized(this) { … }代碼塊
靜態(tài)同步方法會鎖定它的Class對象
內(nèi)部類的同步是獨立于外部類的
synchronized修飾符并不是方法簽名的組成部分,所以不能出現(xiàn)在接口的方法聲明中
非同步的方法不關(guān)心鎖的狀態(tài),它們在同步方法運行時仍然可以得以運行
synchronized實現(xiàn)的鎖是可重入的鎖。
在JVM內(nèi)部,為了提高效率,同時運行的每個線程都會有它正在處理的數(shù)據(jù)的緩存副本,當(dāng)我們使用synchronzied進(jìn)行同步的時候,真正被同步的是在不同線程中表示被鎖定對象的內(nèi)存塊(副本數(shù)據(jù)會保持和主內(nèi)存的同步,現(xiàn)在知道為什么要用同步這個詞匯了吧),簡單的說就是在同步塊或同步方法執(zhí)行完后,對被鎖定的對象做的任何修改要在釋放鎖之前寫回到主內(nèi)存中;在進(jìn)入同步塊得到鎖之后,被鎖定對象的數(shù)據(jù)是從主內(nèi)存中讀出來的,持有鎖的線程的數(shù)據(jù)副本一定和主內(nèi)存中的數(shù)據(jù)視圖是同步的 。
在Java最初的版本中,就有一個叫volatile的關(guān)鍵字,它是一種簡單的同步的處理機制,因為被volatile修飾的變量遵循以下規(guī)則:
變量的值在使用之前總會從主內(nèi)存中再讀取出來。
對變量值的修改總會在完成之后寫回到主內(nèi)存中。
使用volatile關(guān)鍵字可以在多線程環(huán)境下預(yù)防編譯器不正確的優(yōu)化假設(shè)(編譯器可能會將在一個線程中值不會發(fā)生改變的變量優(yōu)化成常量),但只有修改時不依賴當(dāng)前狀態(tài)(讀取時的值)的變量才應(yīng)該聲明為volatile變量。
不變模式也是并發(fā)編程時可以考慮的一種設(shè)計。讓對象的狀態(tài)是不變的,如果希望修改對象的狀態(tài),就會創(chuàng)建對象的副本并將改變寫入副本而不改變原來的對象,這樣就不會出現(xiàn)狀態(tài)不一致的情況,因此不變對象是線程安全的。Java中我們使用頻率極高的String類就采用了這樣的設(shè)計。如果對不變模式不熟悉,可以閱讀閻宏博士的《Java與模式》一書的第34章。說到這里你可能也體會到final關(guān)鍵字的重要意義了。
對不太熟悉程序語言的人來說Java確實比較難理解,但是做為現(xiàn)在最熱門的三種語言來說,程序員們應(yīng)該都會要掌握,電子商務(wù)網(wǎng)站建設(shè)關(guān)于JAVA開發(fā)。
相關(guān)推薦
- 1 手機網(wǎng)站建設(shè)優(yōu)化時應(yīng)注意的事項
- 2 電子商務(wù)商城網(wǎng)站建設(shè)優(yōu)化方案
- 3 電子商務(wù)網(wǎng)站建設(shè)目標(biāo)怎么制定?
- 4 獨立電子商務(wù)網(wǎng)站建設(shè)步驟
- 5 電子商務(wù)網(wǎng)站建設(shè)要有哪些創(chuàng)新?
- 6 電子商務(wù)網(wǎng)站建設(shè)方案須知
- 7 獨立電子商務(wù)網(wǎng)站建設(shè)營銷推廣要點
- 8 電子商務(wù)網(wǎng)站建設(shè)對企業(yè)營銷的作用
- 9 母嬰電子商務(wù)網(wǎng)站建設(shè)分析
- 10 電子商務(wù)網(wǎng)站建設(shè)之htm5開發(fā)