亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

開發(fā)線程安全的SpringWeb應(yīng)用

2019-11-18 13:49:53
字體:
供稿:網(wǎng)友

  前言
  假如開發(fā)者正開發(fā)或維護(hù)基于Servlet的Web應(yīng)用,則Servlet規(guī)范建議最好能夠看看。因?yàn)樗械膬?nèi)容對(duì)于Web應(yīng)用開發(fā)者理解Servlet容器的工作機(jī)理很有幫助。
  
  其中,規(guī)范給出了Servlet容器是如何處理客戶請(qǐng)求的。Servlet容器將會(huì)根據(jù)web.xml配置文件中定義的各個(gè)Servet而創(chuàng)建相應(yīng)的單例。因此,多個(gè)客戶請(qǐng)求可能同時(shí)訪問這些單例,即多個(gè)線程同時(shí)訪問它們。在Web應(yīng)用中保證線程安全是很重要的。開發(fā)者應(yīng)該對(duì)這個(gè)問題保持警惕,而且必須確保各自的代碼必須以線程安全的方式運(yùn)行。
  
  溫習(xí)線程安全
  大部分java開發(fā)者都應(yīng)該聽過synchronized要害字。在不采用任何第三方庫的前提下,Java本身對(duì)線程提供了原生支持,而且synchronized要害字往往是Java應(yīng)用中實(shí)現(xiàn)線程安全最重要的因素。Java中的同步提供了互斥支持。通過同步一塊代碼或整個(gè)方法能夠保證同時(shí)最多只有單個(gè)線程執(zhí)行它,從而實(shí)現(xiàn)了線程安全。引入同步具有副作用,即阻塞。比如,大公司或律師辦公室的前臺(tái)小姐同時(shí)需要處理電話、郵件、受訪客戶等等。這使得她的工作很繁忙,而且導(dǎo)致一些事情不能夠及時(shí)處理。
  
  在Web應(yīng)用中需要警惕阻塞。受同步保護(hù)的代碼塊使得其同時(shí)處理客戶請(qǐng)求的吞吐量降低,而且很多客戶處于阻塞狀態(tài),除非某客戶處理完成。而且互斥不僅會(huì)帶來阻塞,還會(huì)帶來死鎖。通常,死鎖是不可恢復(fù)的。如下條件將觸發(fā)死鎖的發(fā)生:線程A鎖住了線程B等待的資源,而且線程B鎖住了線程A等待的資源,即線程B一直在等待線程A釋放鎖,線程A也是如此。因此,對(duì)于多線程的應(yīng)用而言,死鎖的預(yù)防和處理通常都是很頭疼的。
  
  另外,synchronized要害字還使得大量的同步對(duì)象到處使用,從而引入了死鎖的可能性。比如,java.util.Hashtable和java.util.Vector中提供的方法都是受互斥保護(hù)的,因此除非確實(shí)需要使用它們,否則盡量不用。開發(fā)者只需要使用java.util.HashMap和java.util.ArrayList即可。當(dāng)然,java.util.Collections中的同步方法也使用了synchronized要害字。
  
  盡管可重入更易于治理,但它引入了其他問題??芍厝氪a避免了線程間數(shù)據(jù)的共享??紤]如下代碼(姑且認(rèn)為Java中的方法是線程安全的):
  
  public Double pi() {
  int a = 22;
  int b = 7;
  return new Double(a / b);
  }
  
  不管同時(shí)進(jìn)入該方法的線程有多少,它總是線程安全的。各個(gè)線程都維護(hù)了屬于各個(gè)線程的棧,并不同其他線程共享。其中,各個(gè)線程在當(dāng)前方法(包括靜態(tài)方法)中創(chuàng)建的方法變量?jī)H屬于當(dāng)前線程,即存儲(chǔ)在當(dāng)前線程的棧中。因此,當(dāng)線程A和B同時(shí)進(jìn)入上述方法時(shí),它們都將創(chuàng)建a和b。由于上述方法不存在數(shù)據(jù)共享,因此上述方法是線程安全的。請(qǐng)注重:22/7值同PI值較接近,但它們不相等。
  
  接下來,看看如何優(yōu)化上述代碼吧。
  
  PRivate Double pi = null;
  
  public Double pi() {
  if (pi == null) {
  pi = new Double(22 / 7);
  }
  
  return pi;
  }
  
  盡管改進(jìn)后的方法能夠提高性能,但并不是線程安全的。比如:假如pi為null,而且線程A和B同時(shí)進(jìn)入第4行。因此,線程A和B會(huì)同時(shí)測(cè)試pi是否為空,它們都將返回true。接下來,假如線程A繼續(xù)執(zhí)行(線程B由于某種原因被暫掛),然后返回對(duì)內(nèi)存地址的引用。其中,該內(nèi)存地址含有22/7的結(jié)果,即pi值。最后,線程A退出方法。當(dāng)線程B再次進(jìn)入第5行時(shí),新的內(nèi)存地址將覆蓋原先的內(nèi)存地址(線程A提供的)。這太危險(xiǎn)了,而且這種問題往往難于調(diào)試。
  
  假如使用ThreadLocal,則不僅能夠保證pi()方法是線程安全,而且能夠提供性能的改善。 private static ThreadLocal pi = new ThreadLocal();
  
  public Double pi() {
  if (pi.get() == null) {
  pi.set(new Double(22 / 7));
  }
  return (Double)pi.get();
  }
  
  ThreadLocal類能夠包裹任何對(duì)象,而且能夠?qū)?duì)象綁定到當(dāng)前線程,使得它僅僅供當(dāng)前線程使用。當(dāng)線程初次執(zhí)行pi()方法時(shí),由于沒有對(duì)象綁定到ThreadLocal實(shí)例pi上,因此get()方法返回null。借助于set()方法能夠?qū)?duì)象綁定到當(dāng)前線程,而且不供其它線程使用。因此,假如不同線程需要經(jīng)常訪問pi()方法,則借助于ThreadLocal不僅能夠保證線程安全,而且能夠提高性能。
  
  目前,存在很多關(guān)于如何使用ThreadLocal的資源。在Java 1.4之前,ThreadLocal的性能確實(shí)很差,但是現(xiàn)已解決了這個(gè)問題。另外,由于對(duì)ThreadLocal的錯(cuò)誤理解,使得很多開發(fā)者對(duì)它的誤用。注重,上述實(shí)例使用ThreadLocal的方式是絕對(duì)沒問題的。在引入ThreadLocal后,上述方法的行為并未發(fā)生改變,但是方法已經(jīng)是線程安全的了。
  
  通過可重入的方式開發(fā)線程安全的代碼要求開發(fā)者謹(jǐn)慎使用實(shí)例變量或靜態(tài)變量,尤其對(duì)于修改那些其他線程需要使用的對(duì)象而言。某些場(chǎng)合,使用同步可能更為合適。然而,為識(shí)別由于同步而引起的應(yīng)用性能瓶頸往往只能借助于專業(yè)的性能評(píng)測(cè)工具或負(fù)載測(cè)試完成。
  
  Web應(yīng)用中的線程安全
  在溫習(xí)線程安全的知識(shí)后,來研究Web應(yīng)用中是如何線程安全的吧!開發(fā)者通過創(chuàng)建Web頁面來操作數(shù)據(jù)庫。比如,在Web層和業(yè)務(wù)邏輯層都能夠操作RDBMS。本文使用Hibernate將業(yè)務(wù)模型持久化到數(shù)據(jù)庫中。在Web層,開發(fā)者可以使用Tapestry、Wicket、Struts、WebWork、JSF、Spring MVC,或者其他運(yùn)行在Web容器中的Web框架。
  
  至于Web層的具體實(shí)現(xiàn)并不是本文的重點(diǎn)。本文將關(guān)注如何治理數(shù)據(jù)庫連接,這也是Web應(yīng)用中處理線程安全問題是經(jīng)常要考慮的資源。數(shù)據(jù)庫連接對(duì)象,比如連接、結(jié)果集、Statement、Hibernate session,是有狀態(tài)對(duì)象。當(dāng)然,它們不是線程安全的,因此不能夠同時(shí)供多個(gè)線程訪問。在本文前面已經(jīng)提到,開發(fā)者應(yīng)盡量避免使用同步。無論是synchronized要害字,還是那些同步類(Hashtable或Vector),應(yīng)盡量避免使用。因此,假如使用可重入,則不用處理阻塞或死鎖。
  
  當(dāng)然,通過可重入實(shí)現(xiàn)線程安全以訪問數(shù)據(jù)庫并不是件簡(jiǎn)單的工作。比如,有些開發(fā)者可能會(huì)在Servlet容器配置中添加過濾器。因此,在客戶請(qǐng)求到來時(shí),過濾器將創(chuàng)建JDBC連接或Hibernate Session,并借助于ThreadLocal類將它們綁定到當(dāng)前線程中,從而供業(yè)務(wù)邏輯使用。假如直接使用J2EE API,則開發(fā)者除了需要做很多同業(yè)務(wù)邏輯無關(guān)的操作外,還需要治理事務(wù)、DB錯(cuò)誤等等開發(fā)內(nèi)容。請(qǐng)注重,這些同業(yè)務(wù)邏輯無關(guān)的操作的維護(hù)工作往往很費(fèi)時(shí)間。
  
  Spring的闖入
  一些Java開發(fā)者可能聽說過Spring提供的DAO抽象。當(dāng)然,一些開發(fā)者也有可能使用過它。借助于Spring提供的模板,開發(fā)者能夠使用DAO代碼的重用。借助于Spring AOP,開發(fā)者還能夠使用聲明式事務(wù)。因此,本文來研究Spring是如何實(shí)現(xiàn)以線程安全方式訪問RDBMS的。比如,Spring答應(yīng)以JDBC、Hibernate、JDO、iBATIS、TopLink等方式訪問數(shù)據(jù)庫。如下給出的實(shí)例是企業(yè)應(yīng)用中很常見的情景。
  
  首先,定義數(shù)據(jù)源和用于Hibernate SessionFactory。
  
 ?。糱ean
  id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
 ?。紁roperty name="locations">
 ?。糽ist>
 ?。紇alue>W(wǎng)EB-INF/jdbc.properties</value>
 ?。?list>
 ?。?property>
  </bean>
  
 ?。糱ean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
 ?。紁roperty name="driverClassName"><value>${jdbc.driverClassName}</value></property>
  <property name="url"><value>${jdbc.url}</value></property>
 ?。紁roperty name="username"><value>${jdbc.username}</value></property>
 ?。紁roperty name="passWord"><value>${jdbc.password}</value></property>
  </bean>
  
 ?。糱ean id="sessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
  <property name="dataSource">
 ?。紃ef bean="dataSource"/>
 ?。?property>
 ?。紁roperty name="mappingDirectoryLocations">
 ?。糽ist>
  <value>classpath:</value>
 ?。?list>
 ?。?property>
 ?。紁roperty name="hibernateProperties">
 ?。紁rops>
 ?。紁rop key="hibernate.dialect">net.sf.hibernate.dialect.HSQLDialect</prop>
 ?。紁rop key="hibernate.show_sql">true</prop>
 ?。?props>
 ?。?property>
 ?。?bean>
  這是使用Hibernate的典型配置,即通過定義的數(shù)據(jù)源連接到數(shù)據(jù)庫、通過本地SessionFactory創(chuàng)建Hibernate SessionFactory。接下來,需要定義業(yè)務(wù)對(duì)象(實(shí)現(xiàn)對(duì)DB的訪問)和事務(wù)治理器(通過Hibernate Session治理本地事務(wù))。其中,業(yè)務(wù)對(duì)象暴露的方法能夠在數(shù)據(jù)庫中添加新的紀(jì)錄,而事務(wù)治理器能夠?qū)⒎椒ò谑聞?wù)中。它們的定義如下。
  
  public interface CustomerDAO {
  public void createCustomer(Customer customer);
  }
  
  public class HibernateCustomerDAO implements CustomerDAO {
  
  private HibernateTemplate hibernateTemplate = null;
  
  public void setSessionFactory(SessionFactory sessionFactory) {
  this.hibernateTemplate = new HibernateTemplate(sessionFactory, false);
  }
  
  public void createCustomer(Customer customer) {

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
五月天婷婷网站| 欧洲永久精品大片ww免费漫画| 精品小视频在线| 五月丁香综合缴情六月小说| 少妇欧美激情一区二区三区| 色www永久免费视频首页在线| 成人免费视频视频| 日本久久久久亚洲中字幕| 久久精品xxxxx| 人妻精品久久久久中文字幕| 欧美精品久久久久久久免费观看| 久久久精彩视频| 免费黄色的网站| 亚洲欧洲一区二区天堂久久| www.一区| 欧美少妇一区二区三区| 国产亚洲欧美精品久久久www| www.999av| 亚洲精品中文字幕有码专区| 久久99热这里只有精品国产| 成人一级片免费看| 国色天香久久精品国产一区| 日本三级福利片| 精品人妻一区二区三区换脸明星| 国偷自产av一区二区三区麻豆| 国产精品99久久不卡二区| 久久伊人一区| 最新国产黄色网址| 亚洲日本青草视频在线怡红院| 午夜影院日韩| 一区二区三区加勒比av| jizzjizzjizz中国免费| 日韩不卡高清| 日韩精品视频免费专区在线播放| 神马一区二区三区| 亚洲 日韩 国产第一区| 久操视频在线免费播放| 天堂av网在线| jizz.www| 手机在线观看你懂的| 蜜桃精品在线| 亚洲自拍欧美精品| 中文 欧美 日韩| 喷水视频在线观看| 欧美一区二区三区免费| 波多野结依一区| 视频在线99| 国产三级小视频| 四季av一区二区三区| 午夜精品久久久久久久星辰影院| crdy在线观看欧美| 一区二区www| 久久午夜a级毛片| 久久精品亚洲欧美日韩精品中文字幕| 91麻豆成人久久精品二区三区| 强行糟蹋人妻hd中文| 26uuu欧美日本| 久久国产影院| 亚洲视频色图| 欧美成人资源| 高清一区二区三区日本久| 国产精品一级片| 亚洲精品一区中文字幕乱码| 456成人影院在线观看| 国产第一页在线观看| 亚洲另类春色国产| 国产精品影视网| 中文字幕在线一区免费| 中文字幕不卡在线播放| 好吊一区二区三区| 欧美jizzhd精品欧美满| 91年精品国产| 欧美日韩精品综合| 91国内精品久久久| 网曝91综合精品门事件在线| 农民人伦一区二区三区| 无码精品视频一区二区三区| 国产在线观看一区二区| 欧美一级片免费观看| 精品国产一区二区三区免费| 国产freexxxx性播放麻豆| 午夜两性免费视频| 国产成人av福利| 蜜臀av国内免费精品久久久夜夜| 在线免费观看的av网站| 狠狠躁夜夜躁人人爽视频| 欧美日韩一区二区三区在线免费观看| 91美女片黄在线观看游戏| 国模大尺度视频| 国产一区二区三区福利| 国产精品videosex性欧美| 亚洲乱码国产乱码精品精天堂| 黄色片网站在线观看| 国产乱码精品| 国产啊啊啊视频在线观看| 亚洲精品综合在线| 第一区第二区在线| 久视频在线观看| 成人在线播放av| 黄色免费在线网站| 成人黄网18免费观看的网站| 成人精品高清在线| 欧美成人家庭影院| 亚洲激情在线观看视频免费| 亚洲欧洲美洲一区二区三区| 在线观看免费国产成人软件| 日韩一级黄色片| 国产精品va| 日韩电影免费在线观看中文字幕| 国产xxxxxx| 成人av资源站| 美女精品视频在线| 成人一二三区视频| 一区精品在线观看| 免费观看v片在线观看| 中文字幕亚洲欧美在线| jizzjizz国产| 中文av在线播放| 亚洲精品中文字幕有码专区| 久久久精品在线| 国产精品丝袜一区二区三区| 成人黄色激情网站| 久久精品国产精品亚洲毛片| 精品国产_亚洲人成在线| 免费观看不卡av| 精品日韩一区二区| 粉嫩av国产一区二区三区| 亚洲精品日韩久久| 中文字幕第一页久久| 日韩不卡手机在线v区| 麻豆视频在线| 污视频软件在线观看| 欧美1区2区| av在线不卡精品| www.污污视频| 丝袜脚交免费网站xx| 欧美高清hd18日本| 翔田千里一区二区| 亚洲网在线观看| 激情亚洲网站| 欧美激情一区二区三区p站| 2019中文亚洲字幕| 欧美五级在线观看视频播放| 欧洲国内综合视频| 成人高清伦理免费影院在线观看| 欧美日韩综合一区| 亚洲天堂网在线播放| 色8久久影院午夜场| 国产美女在线一区| 欧美乱妇高清无乱码| 国产精品久久久久久久精| 日韩在线黄色| 国产精品最新自拍| 亚洲va国产va天堂va久久| 日本黄色一级网站| 亚洲人成小说网站色在线| 国产91高潮流白浆在线麻豆| 亚洲人成电影网站色| 一区二区精品免费视频| 国产一区私人高清影院| 欧美xxx另类| 国产精品亚洲а∨天堂免在线| 丰满熟女一区二区三区| 亚洲影视中文字幕| 亚洲一区二区自拍| 国产激情无码一区二区三区| 爱情岛论坛vip永久入口| 国产精品午夜国产小视频| 国产精品白浆| 狠狠干五月天| 国产二区不卡| 欧美日韩性在线观看| 久久久久久久| 久久人人97超碰com| 黄色在线播放| 国产精品美女网站| 97视频在线免费| 国产精品白嫩美女在线观看| 欧美日韩亚洲一区三区| 国产啊啊啊视频在线观看| 欧美日韩国产色站一区二区三区| 9797在线看片亚洲精品| 国产精品欧美久久久| 99精品国产热久久91蜜凸| 免费看日批视频| igao视频网在线视频| 国产精品91久久久久久| 欧美日韩一区三区四区| 国产精品视频一区二区三区麻豆| 精品国产aaa| 午夜精品亚洲一区二区三区嫩草| 亚洲s色大片在线观看| 日本黄色免费网址| 国产91精品不卡视频| 欧美精品久久久久| 国产女主播一区二区三区| 亚洲制服国产| 美女免费久久| 国产精品中文字幕在线观看| 白白色在线发布| 久久国产在线观看| 亚洲精品中文字幕乱码| 50路60路老熟妇啪啪| 欧美激情精品久久久久久蜜臀| √天堂中文在线| 精品国产18久久久久久洗澡| 亚洲japanese制服美女| 色诱女教师一区二区三区| 久久久久久久久久国产| 日本免费观看视| 午夜在线观看免费一区| 成人不卡免费视频| 在线欧美日韩| 久久久久久毛片| 日韩av电影中文字幕| 久久久久久久久艹| 日韩美脚连裤袜丝袜在线| 免费h片在线| 91沈先生播放一区二区| 尤物精品在线| 日本乱人伦aⅴ精品| 久久久久国产精品一区三寸| 三年中国中文在线观看免费播放| 精品视频在线免费| 明星乱亚洲合成图.com| 国产福利在线免费| 国产精品成人av久久| 国产探花一区在线观看| 波多野结衣日韩| 经典三级在线视频| 成人毛片免费在线观看| 狠狠激情五月综合婷婷俺| 国产成人精品无码播放| 国产成人一区二区| h网址在线观看| 日本在线视频一区| 日韩欧美国产另类| av资源在线观看免费高清| 日本久久中文字幕| 国产精品天干天干在线综合| 国产在线播精品第三| 欧美少妇激情| 亚洲精品永久免费精品| 国产成人的电影在线观看| eeuss影院www免费视频| 成人午夜国产福到在线| 最新中文字幕免费视频| 日韩在线视频免费播放| 欧美在线观看视频| 自拍在线播放| 亚洲综合在线中文字幕| 欧美少妇一区二区三区| 亚欧洲精品视频在线观看| 成年人在线网站| 欧美日韩精品一本二本三本| 成人黄色在线看| 国产精品一区在线免费观看| 国产ts在线播放| 欧洲成人免费视频| www.中文字幕久久久| 成人免费视频网站在线看| 亚洲美女欧洲| 成人网18免费软件大全| 欧美精品一区二区三区精品| 欧美自拍偷拍| 黄色精品视频在线观看| 欧美黄色小视频| 国产一级片大全| 亚洲熟妇av日韩熟妇在线| 日精品一区二区三区| 91xxxxx| 欧美jizz| 一区二区三区四区影院| 在线观看免费视频国产| 国产在线观看免费播放| 亚洲va久久久噜噜噜久久| 国产丝袜自拍| 91视频xxxx| 久久精品欧美一区二区三区麻豆| 高清一区二区三区| 日韩在线你懂得| 嫩草影院一区二区| 国产熟女一区二区三区五月婷| 色一情一区二区三区| 五月婷婷综合久久| 国产精品美女主播| 欧美日韩亚洲一区二区三区在线| 一区二区三区www污污污网站| 久久久久天天天天| 日本久久久久久久久| 亚洲高清久久| 欧美成人日韩| 在线观看欧美日韩国产| 中文字幕视频观看| 欧美日韩免费一区二区| 亚洲а∨精品天堂在线| 91国模少妇一区二区三区| 欧美激情性xxxxx| 中文字幕日本在线| 韩国三级与黑人| 国产精品久久在线| 中文字幕有码无码人妻av蜜桃| av免费观看国产| 国外成人免费视频| 日韩欧美一级在线播放| 国产精品黄色| 精品人妻午夜一区二区三区四区| 四虎影视最新网址| 国产不卡一区二区三区在线观看| 久久久久网址| 91青青草免费在线看| 亚洲免费观看高清完整版在线观看| 7777奇米亚洲综合久久| av影片在线播放| 欧美一区二区三区在线| 三级a三级三级三级a十八发禁止| 九色porny丨入口在线| 少妇视频一区二区| 色婷婷久久99综合精品jk白丝| 成人黄色网免费| 黄色小视频免费观看| 九九九久久久精品| 久久精品日韩精品| 国产区在线观看成人精品| 成人欧美亚洲| 成人免费观看在线网址| 欧美黄色性视频| 国产亚洲成人一区|