私域流量社交電商軟件及相關(guān)增值服務(wù)提供商--HiShop海商

返回
HiShop / 電子商務(wù)解決方案 / 云建站 / 云建站行業(yè)資訊 /

電子商務(wù)網(wǎng)站建設(shè)關(guān)于JAVA開發(fā)

2018-10-12|HiShop|閱讀量:
導(dǎo)讀:針對(duì)電子商務(wù)網(wǎng)站建設(shè),我們會(huì)有不同的語言進(jìn)行開發(fā),其中PHP,.net,Java是現(xiàn)在都比較熱門的開發(fā)程序語言,那么接下來我們就來分析下JAVA語言開發(fā),電子商務(wù)網(wǎng)站建設(shè)關(guān)于JAVA開發(fā)。...

電子商務(wù)網(wǎng)站建設(shè)關(guān)于JAVA開發(fā)

  針對(duì)電子商務(wù)網(wǎng)站建設(shè),我們會(huì)有不同的語言進(jìn)行開發(fā),其中PHP,.net,Java是現(xiàn)在都比較熱門的開發(fā)程序語言,那么接下來我們就來分析下JAVA語言開發(fā),電子商務(wù)網(wǎng)站建設(shè)關(guān)于JAVA開發(fā)。

  為什么需要并發(fā)

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

  誤解和正解

  最常見的對(duì)并發(fā)編程的誤解有以下這些:

  并發(fā)總能改進(jìn)性能(并發(fā)在CPU有很多空閑時(shí)間時(shí)能明顯改進(jìn)程序的性能,但當(dāng)線程數(shù)量較多的時(shí)候,線程間頻繁的調(diào)度切換反而會(huì)讓系統(tǒng)的性能下降)

  編寫并發(fā)程序無需修改原有的設(shè)計(jì)(目的與時(shí)機(jī)的解耦往往會(huì)對(duì)系統(tǒng)結(jié)構(gòu)產(chǎn)生巨大的影響)

  在使用Web或EJB容器時(shí)不用關(guān)注并發(fā)問題(只有了解了容器在做什么,才能更好的使用容器)

  下面的這些說法才是對(duì)并發(fā)客觀的認(rèn)識(shí):

  編寫并發(fā)程序會(huì)在代碼上增加額外的開銷

  正確的并發(fā)是非常復(fù)雜的,即使對(duì)于很簡單的問題

  并發(fā)中的缺陷因?yàn)椴灰字噩F(xiàn)也不容易被發(fā)現(xiàn)

  并發(fā)往往需要對(duì)設(shè)計(jì)策略從根本上進(jìn)行修改

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

  單一職責(zé)原則

  分離并發(fā)相關(guān)代碼和其他代碼(并發(fā)相關(guān)代碼有自己的開發(fā)、修改和調(diào)優(yōu)生命周期)。

  限制數(shù)據(jù)作用域

  兩個(gè)線程修改共享對(duì)象的同一字段時(shí)可能會(huì)相互干擾,導(dǎo)致不可預(yù)期的行為,解決方案之一是構(gòu)造臨界區(qū),但是必須限制臨界區(qū)的數(shù)量。

  使用數(shù)據(jù)副本

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

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

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

  Java 5以前的并發(fā)編程

  Java的線程模型建立在搶占式線程調(diào)度的基礎(chǔ)上,也就是說:

  所有線程可以很容易的共享同一進(jìn)程中的對(duì)象。

  能夠引用這些對(duì)象的任何線程都可以修改這些對(duì)象。

  為了保護(hù)數(shù)據(jù),對(duì)象可以被鎖住。

  Java基于線程和鎖的并發(fā)過于底層,而且使用鎖很多時(shí)候都是很萬惡的,因?yàn)樗喈?dāng)于讓所有的并發(fā)都變成了排隊(duì)等待。

  在Java 5以前,可以用synchronized關(guān)鍵字來實(shí)現(xiàn)鎖的功能,它可以用在代碼塊和方法上,表示在執(zhí)行整個(gè)代碼塊或方法之前線程必須取得合適的鎖。對(duì)于類的非靜態(tài)方法(成員方法)而言,這意味這要取得對(duì)象實(shí)例的鎖,對(duì)于類的靜態(tài)方法(類方法)而言,要取得類的Class對(duì)象的鎖,對(duì)于同步代碼塊,程序員可以指定要取得的是那個(gè)對(duì)象的鎖。

  不管是同步代碼塊還是同步方法,每次只有一個(gè)線程可以進(jìn)入,如果其他線程試圖進(jìn)入(不管是同一同步塊還是不同的同步塊),JVM會(huì)將它們掛起(放入到等鎖池中)。這種結(jié)構(gòu)在并發(fā)理論中稱為臨界區(qū)(critical section)。這里我們可以對(duì)Java中用synchronized實(shí)現(xiàn)同步和鎖的功能做一個(gè)總結(jié):

  只能鎖定對(duì)象,不能鎖定基本數(shù)據(jù)類型

  被鎖定的對(duì)象數(shù)組中的單個(gè)對(duì)象不會(huì)被鎖定

  同步方法可以視為包含整個(gè)方法的synchronized(this) { … }代碼塊

  靜態(tài)同步方法會(huì)鎖定它的Class對(duì)象

  內(nèi)部類的同步是獨(dú)立于外部類的

  synchronized修飾符并不是方法簽名的組成部分,所以不能出現(xiàn)在接口的方法聲明中

  非同步的方法不關(guān)心鎖的狀態(tài),它們?cè)谕椒椒ㄟ\(yùn)行時(shí)仍然可以得以運(yùn)行

  synchronized實(shí)現(xiàn)的鎖是可重入的鎖。

  在JVM內(nèi)部,為了提高效率,同時(shí)運(yùn)行的每個(gè)線程都會(huì)有它正在處理的數(shù)據(jù)的緩存副本,當(dāng)我們使用synchronzied進(jìn)行同步的時(shí)候,真正被同步的是在不同線程中表示被鎖定對(duì)象的內(nèi)存塊(副本數(shù)據(jù)會(huì)保持和主內(nèi)存的同步,現(xiàn)在知道為什么要用同步這個(gè)詞匯了吧),簡單的說就是在同步塊或同步方法執(zhí)行完后,對(duì)被鎖定的對(duì)象做的任何修改要在釋放鎖之前寫回到主內(nèi)存中;在進(jìn)入同步塊得到鎖之后,被鎖定對(duì)象的數(shù)據(jù)是從主內(nèi)存中讀出來的,持有鎖的線程的數(shù)據(jù)副本一定和主內(nèi)存中的數(shù)據(jù)視圖是同步的 。

  在Java最初的版本中,就有一個(gè)叫volatile的關(guān)鍵字,它是一種簡單的同步的處理機(jī)制,因?yàn)楸籿olatile修飾的變量遵循以下規(guī)則:

  變量的值在使用之前總會(huì)從主內(nèi)存中再讀取出來。

  對(duì)變量值的修改總會(huì)在完成之后寫回到主內(nèi)存中。

  使用volatile關(guān)鍵字可以在多線程環(huán)境下預(yù)防編譯器不正確的優(yōu)化假設(shè)(編譯器可能會(huì)將在一個(gè)線程中值不會(huì)發(fā)生改變的變量優(yōu)化成常量),但只有修改時(shí)不依賴當(dāng)前狀態(tài)(讀取時(shí)的值)的變量才應(yīng)該聲明為volatile變量。

  不變模式也是并發(fā)編程時(shí)可以考慮的一種設(shè)計(jì)。讓對(duì)象的狀態(tài)是不變的,如果希望修改對(duì)象的狀態(tài),就會(huì)創(chuàng)建對(duì)象的副本并將改變寫入副本而不改變?cè)瓉淼膶?duì)象,這樣就不會(huì)出現(xiàn)狀態(tài)不一致的情況,因此不變對(duì)象是線程安全的。Java中我們使用頻率極高的String類就采用了這樣的設(shè)計(jì)。如果對(duì)不變模式不熟悉,可以閱讀閻宏博士的《Java與模式》一書的第34章。說到這里你可能也體會(huì)到final關(guān)鍵字的重要意義了。

  對(duì)不太熟悉程序語言的人來說Java確實(shí)比較難理解,但是做為現(xiàn)在最熱門的三種語言來說,程序員們應(yīng)該都會(huì)要掌握,電子商務(wù)網(wǎng)站建設(shè)關(guān)于JAVA開發(fā)。

相關(guān)推薦

產(chǎn)品推薦
  • 移動(dòng)云商城
    一款會(huì)賺錢的網(wǎng)上商城系統(tǒng)——移動(dòng)云商城,讓零售企業(yè)轉(zhuǎn)型電商更簡單!獨(dú)創(chuàng)6合一全網(wǎng)營銷模式、裂變式推廣分傭快速吸粉引流,不論微信、APP、手機(jī)觸屏還是PC端網(wǎng)上購物商城,只要1個(gè)后臺(tái)即可掌控全網(wǎng)最火爆的6大商城!詳情
關(guān)注HiShop

電話咨詢 預(yù)約演示 0元開店