??xml version="1.0" encoding="utf-8" standalone="yes"?>欧美久久免费观看,有码一区二区三区,久久久久久久久国产一区http://www.aygfsteel.com/jiejinjivsn/archive/2010/07/29/327451.html睫晋?/dc:creator>睫晋?/author>Thu, 29 Jul 2010 08:10:00 GMThttp://www.aygfsteel.com/jiejinjivsn/archive/2010/07/29/327451.htmlhttp://www.aygfsteel.com/jiejinjivsn/comments/327451.htmlhttp://www.aygfsteel.com/jiejinjivsn/archive/2010/07/29/327451.html#Feedback0http://www.aygfsteel.com/jiejinjivsn/comments/commentRss/327451.htmlhttp://www.aygfsteel.com/jiejinjivsn/services/trackbacks/327451.html  Sun推出的专业认证包括下列三U:

  ◆JAVA认证考试

  对于JAVAE序设计员,Sun推出两项认证:

  Sun Certified JAVA Programmer(SCJP)

  Sun Certified JAVA Developer(SCJD)

  JavaE序员的认证Sun Certified JAVA Programmer(SCJP)评QSL-275JAVA语言~程,考试号ؓ310-025.

  java开发员认证Sun Certified JAVA DeverloperQSCJDQ,认证考试以Sun指定的javaSL-285为教材,部分的考试号ؓ310-027?/font>

  SCJP验JAVAE序设计概念及能力,内容偏重于JAVA语法及JDK的内容;SCJD则进一步测试用JAVA开发应用程序的能力Q考试者必d完成一个程序的设计ҎQ再回答与此Ҏ相关的一些问题?/font>

  ◆Solarispȝ理认证考试

  对Solaris/SunOSpȝ理员,Sun推出Certified Solaris Administrator(CSA)。CSA分别Z个等U?PartI和PartII)Q测试对Solarispȝ理的了解程度?/font>

  ◆Solaris|络理认证考试

  Z试使用者对于Solaris|络理能力QSun推出Certified Network Administrator(CNA)。内容包括基本网l概cRoutingandSubnet、Security、Performance、DNS、NIS+{?/font>

  SunJava认证是业界唯一lSun授权Java认证培训。Sun认证Java开发员考试内容包括完整的Java应用E序开发,涉及数据库、图形用L面、网l通信、^台移植等各方面内容,要求学员已通过JavaE序员认证。学习结束后Q可参加全球q网考试。考试合格则由Sun公司颁发国际通用的Java开发员证书?/font>

  Java语言?995q发布以来,因其h单性、跨q_、面向对象等特点Q受到程序员们的Ƣ迎Q经q这几年的迅速发展,现在已经成ؓ和C++语言q列的主开发语a。Java语言的广泛用,使得来多的h加入到Java语言的学习和应用中来?/font>

  在这些h当中Q许多h选择了经qSun公司授权的Sun教育中心QASECQ来学习Q因为和一些非授权的中心相比,只有ASEC受到Sunl合机床公司的关注和支持Q他们可以提供最新的培训材料和Sun需要的_深技术资源。学员在那里可以学习到最新的Java技术,更顺利地通过SunJava的认证考试?/font>

  了解SunJava认证评

  Java不仅仅是一U编E语aQ同时它也是一个开发和q行的^収ͼ有自己完整的体系l构。SunJava认证评从中选择了最h代表性的一些方面?/font>

  SCJPQSun Certified Java ProgrammerQ可以说是各UJava认证的基Q其对应的最主要的学习课E是一门Java的基评Q也是Java Programming LanguageQSL-275Q,q也是国内的SCJP培训的标准课E。而SCJDQSun Certified Java DeveloperQ则可以看做是高U的Java技术培训认证,其要求和隑ֺ都要高于SCJPQ而且Q如果你计划获得SCJD认证Q则要先获得SCJP认证资格。SCEAQSun Certified Enterprise Architect for J2EE TechnologyQ认证的隑ֺ也不,其学习课E主要有两个Q?0-226O bject-Oriented Analysisand Design以及SL-425 Architectingand Designing J2EE Applications。SCWDQSun Certified WebComponent Developer for Java2 Platform Enterprise EditionQ是Sun新推出的Java认证考试Q主要面向用JavaServlet以及JSP技术开发Web应用E序的相x术认证?/font>

  如何获取Java认证

  首先Q你需要有充分的心理准备,因ؓSunJava认证考试非常严}Q需要你具备充的实늻验才可能通过?/font>



]]>
springq接池配|详?/title><link>http://www.aygfsteel.com/jiejinjivsn/archive/2010/07/29/327450.html</link><dc:creator>睫晋?/dc:creator><author>睫晋?/author><pubDate>Thu, 29 Jul 2010 08:03:00 GMT</pubDate><guid>http://www.aygfsteel.com/jiejinjivsn/archive/2010/07/29/327450.html</guid><wfw:comment>http://www.aygfsteel.com/jiejinjivsn/comments/327450.html</wfw:comment><comments>http://www.aygfsteel.com/jiejinjivsn/archive/2010/07/29/327450.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/jiejinjivsn/comments/commentRss/327450.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/jiejinjivsn/services/trackbacks/327450.html</trackback:ping><description><![CDATA[<p><font color="#000000">  数据库连接池概述Q?/font></p> <p><font color="#000000">  数据库连接是一U关键的有限的昂늚资源Q这一点在多用L|页应用E序中体现得ؓH出。对数据库连接的理能显著媄响到整个应用E序的׾~性和健壮性,影响到程序的性能指标。数据库q接池正是针对这个问题提出来的?/font></p> <p><font color="#000000">  数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复用一个现有的数据库连接,而再不是重新建立一个;释放I闲旉过最大空闲时间的数据库连接来避免因ؓ没有释放数据库连接而引L数据库连接遗漏。这Ҏ术能明显提高Ҏ据库操作的性能?/font></p> <p><font color="#000000">  数据库连接池在初始化时将创徏一定数量的数据库连接放到连接池中,q些数据库连接的数量是由最数据库q接数来讑֮的。无些数据库q接是否被用,q接池都一直保证至拥有这么多的连接数量。连接池的最大数据库q接</font><a ><font color="#000000">q洗讑֤</font></a><font color="#000000">数量限定了这个连接池能占有的最大连接数Q当应用E序向连接池h的连接数过最大连接数量时Q这些请求将被加入到{待队列中。数据库q接池的最连接数和最大连接数的设|要考虑C列几个因素:</font></p> <p><font color="#000000">  1) 最连接数是连接池一直保持的数据库连接,所以如果应用程序对数据库连接的使用量不大,会有大量的数据库连接资源被费Q?/font></p> <p><font color="#000000">  2) 最大连接数是连接池能申L最大连接数Q如果数据库q接h过此数Q后面的数据库连接请求将被加入到{待队列中,q会影响之后的数据库操作?/font></p> <p><font color="#000000">  3) 如果最连接数与最大连接数相差太大Q那么最先的q接h会获利Q之后超q最连接数量的q接h{h于徏立一个新的数据库q接。不q,q些大于最连接数的数据库q接在用完不会马上被释放,它将被放到连接池中等待重复用或是空闲超时后被释放?/font></p> <p><font color="#000000">  目前常用的连接池有:C3P0、DBCP、Proxool</font></p> <p><font color="#000000">  |上的评hQ?/font></p> <p><font color="#000000">  C3P0比较耗费资源Q效率方面可能要低一炏V?/font></p> <p><font color="#000000">  DBCP在实践中存在BUGQ在某些U情会生很多空q接不能释放QHibernate3.0已经攑ּ了对其的支持?/font></p> <p><font color="#000000">  Proxool的负面评仯,现在比较推荐它,而且它还提供x监控q接池状态的功能Q便于发现连接泄漏的情况?/font></p> <p><font color="#000000">  配置如下Q?/font></p> <p><font color="#000000">  1、在spring配置文g中,一般在applicationContext.xml?/font></p> <p><font color="#000000">  <bean id="DataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource" destroy-method="shutdown"></font></p> <p><font color="#000000">  <property name="driver"></font></p> <p><font color="#000000">  <value>oracle.jdbc.driver.OracleDriver</value></font></p> <p><font color="#000000">  </property></font></p> <p><font color="#000000">  <property name="driverUrl"></font></p> <p><font color="#000000">  <value>jdbc:oracle:thin:xxxx/xxxx@192.168.0.XX:1521:server</value></font></p> <p><font color="#000000">  </property></font></p> <p><font color="#000000">  <property name="user"></font></p> <p><font color="#000000">  <value>xxxx</value></font></p> <p><font color="#000000">  </property></font></p> <p><font color="#000000">  <property name="password"></font></p> <p><font color="#000000">  <value>xxxx</value></font></p> <p><font color="#000000">  </property></font></p> <p><font color="#000000">  <property name="alias"></font></p> <p><font color="#000000">  <value>server</value></font></p> <p><font color="#000000">  </property></font></p> <p><font color="#000000">  <property name="houseKeepingSleepTime"></font></p> <p><font color="#000000">  <value>30000</value></font></p> <p><font color="#000000">  </property></font></p> <p><font color="#000000">  <property name="houseKeepingTestSql"></font></p> <p><font color="#000000">  <value>select 1 from dual</value></font></p> <p><font color="#000000">  </property></font></p> <p><font color="#000000">  <property name="testBeforeUse"></font></p> <p><font color="#000000">  <value>true</value></font></p> <p><font color="#000000">  </property></font></p> <p><font color="#000000">  <property name="testAfterUse"></font></p> <p><font color="#000000">  <value>true</value></font></p> <p><font color="#000000">  </property></font></p> <p><font color="#000000">  <property name="prototypeCount"></font></p> <p><font color="#000000">  <value>5</value></font></p> <p><font color="#000000">  </property></font></p> <p><font color="#000000">  <property name="maximumConnectionCount"></font></p> <p><font color="#000000">  <value>400</value></font></p> <p><font color="#000000">  </property></font></p> <p><font color="#000000">  <property name="minimumConnectionCount"></font></p> <p><font color="#000000">  <value>10</value></font></p> <p><font color="#000000">  </property></font></p> <p><font color="#000000">  <property name="statistics"></font></p> <p><font color="#000000">  <value>1m,15m,1d</value></font></p> <p><font color="#000000">  </property></font></p> <p><font color="#000000">  <property name="statisticsLogLevel"></font></p> <p><font color="#000000">  <value>ERROR</value></font></p> <p><font color="#000000">  </property></font></p> <p><font color="#000000">  <property name="trace"></font></p> <p><font color="#000000">  <value>true</value></font></p> <p><font color="#000000">  </property></font></p> <p><font color="#000000">  <property name="verbose"></font></p> <p><font color="#000000">  <value>false</value></font></p> <p><font color="#000000">  </property></font></p> <p><font color="#000000">  <property name="simultaneousBuildThrottle"></font></p> <p><font color="#000000">  <value>1600</value></font></p> <p><font color="#000000">  </property></font></p> <p><font color="#000000">  <property name="maximumActiveTime"></font></p> <p><font color="#000000">  <value>600000</value></font></p> <p><font color="#000000">  </property></font></p> <p><font color="#000000">  <property name="jmx"></font></p> <p><font color="#000000">  <value>false</value></font></p> <p><font color="#000000">  </property></font></p> <p><font color="#000000">  </bean></font></p> <p><font color="#000000">  然后注入到sessionFactory?/font></p> <p><font color="#000000">  <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"></font></p> <p><font color="#000000">  <property name="dataSource" ref="DataSource"/></font></p> <p><font color="#000000">  </bean></font></p> <p><font color="#000000">  属性列表说?</font></p> <p><font color="#000000">  fatal-sql-exception: 它是一个逗号分割的信息片D?当一个SQL异常发生?他的异常信息与q个信息片段q行比较.如果在片D中存在,那么q个异常被认ؓ是个致命错误(Fatal SQL Exception ).q种情况?数据库连接将要被攑ּ.无论发生什?q个异常会被重掷以提供l消费?用户最好自己配|一个不同的异常来抛?</font></p> <p><font color="#000000">  fatal-sql-exception-wrapper-class:正如上面所?你最好配|一个不同的异常来重?利用q个属?用户可以包装SQLException,使他变成另外一个异?q个异常或者承QLException或者承字RuntimeException.proxool自带?个实?'org.logicalcobwebs.proxool.FatalSQLException'?org.logicalcobwebs.proxool.FatalRuntimeException'.后者更合?</font></p> <p><font color="#000000">  house-keeping-sleep-time: house keeper 保留U程处于睡眠状态的最长时?house keeper 的职责就是检查各个连接的状?q判断是否需要销毁或者创?</font></p> <p><font color="#000000">  house-keeping-test-sql:  如果发现了空闲的数据库连?house keeper 会用这个语句来试.q个语句最好非常快的被执行.如果没有定义,试q程会被忽略?/font></p> <p><font color="#000000">  injectable-connection-interface: 允许proxool实现被代理的connection对象的方?</font></p> <p><font color="#000000">  injectable-statement-interface: 允许proxool实现被代理的Statement 对象Ҏ.</font></p> <p><font color="#000000">  injectable-prepared-statement-interface: 允许proxool实现被代理的PreparedStatement 对象Ҏ.</font></p> <p><font color="#000000">  injectable-callable-statement-interface: 允许proxool实现被代理的CallableStatement 对象Ҏ.</font></p> <p><font color="#000000">  jmx: 如果属性ؓtrueQ就会注册一个消息Bean到jms服务Q消息Bean对象? "Proxool:type=Pool, name=<alias>". 默认gؓfalse.</font></p> <p><font color="#000000">  jmx-agent-id: 一个逗号分隔的JMX代理列表(如用MBeanServerFactory.findMBeanServer(String agentId)注册的连接池。)q个属性是仅当"jmx"属性设|ؓ"true"才有效。所有注册jmx服务器用这个属性是不确定的</font></p> <p><font color="#000000">  jndi-name: 数据源的名称</font></p> <p><font color="#000000">  maximum-active-time: 如果housekeeper 到某个U程的活动时间大于这个数?它将会杀掉这个线E?所以确认一下你的服务器的带?然后定一个合适的?默认?分钟.</font></p> <p><font color="#000000">  maximum-connection-count: 最大的数据库连接数.</font></p> <p><font color="#000000">  maximum-connection-lifetime: 一个线E的最大寿?</font></p> <p><font color="#000000">  minimum-connection-count: 最的数据库连接数</font></p> <p><font color="#000000">  overload-without-refusal-lifetime: q可以帮助我们确定连接池的状态。如果我们已l拒l了一个连接在q个讑֮?毫秒),然后被认为是蝲。默认ؓ60U?/font></p> <p><font color="#000000">  prototype-count: q接池中可用的连接数?如果当前的连接池中的q接于q个数?新的q接被建立(假设没有过最大可用数).例如.我们?个活动连?个可用连?而我们的prototype-count?,那么数据库连接池试囑־立另?个连?q和 minimum-connection-count不同. minimum-connection-count把活动的q接也计在?prototype-count 是spare connections 的数?</font></p> <p><font color="#000000">  recently-started-threshold: q可以帮助我们确定连接池的状?q接数少q是多或蝲。只要至有一个连接已开始在此?毫秒)?或者有一些多余的可用q接,那么我们假设q接池是开启的。默认ؓ60U?/font></p> <p><font color="#000000">  simultaneous-build-throttle: q是我们可一ơ徏立的最大连接数。那是新增的连接请?但还没有可供使用的连接。由于连接可以用多U程,在有限的旉之间建立联系从而带来可用连接,但是我们需要通过一些方式确认一些线Eƈ不是立即响应q接h的,默认?0?/font></p> <p><font color="#000000">  statistics:  q接池用状늻计?参数“10s,1m,1d”</font></p> <p><font color="#000000">  statistics-log-level: 日志l计跟踪cd?参数“ERROR”?“INFO”</font></p> <p><font color="#000000">  test-before-use: 如果为trueQ在每个q接被测试前都会服务q个q接Q如果一个连接失败,那么被丢弃Q另一个连接将会被处理Q如果所有连接都p|Q一个新的连接将会被建立。否则将会抛Z个SQLException异常?/font></p> <p><font color="#000000">  test-after-use: 如果为trueQ在每个q接被测试后都会服务q个q接Q其回到连接池中,如果q接p|Q那么将被废弃?/font></p> <p><font color="#000000">  trace: 如果为true,那么每个被执行的SQL语句会在执行期被log记录(DEBUG LEVEL).你也可以注册一个ConnectionListener (参看ProxoolFacade)得到q些信息.</font></p> <p><font color="#000000">  verbose: 详细信息讄?参数 bool ?/font></p> <img src ="http://www.aygfsteel.com/jiejinjivsn/aggbug/327450.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/jiejinjivsn/" target="_blank">睫晋?/a> 2010-07-29 16:03 <a href="http://www.aygfsteel.com/jiejinjivsn/archive/2010/07/29/327450.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java中的LookAndFeelhttp://www.aygfsteel.com/jiejinjivsn/archive/2010/07/29/327449.html睫晋?/dc:creator>睫晋?/author>Thu, 29 Jul 2010 08:00:00 GMThttp://www.aygfsteel.com/jiejinjivsn/archive/2010/07/29/327449.htmlhttp://www.aygfsteel.com/jiejinjivsn/comments/327449.htmlhttp://www.aygfsteel.com/jiejinjivsn/archive/2010/07/29/327449.html#Feedback0http://www.aygfsteel.com/jiejinjivsn/comments/commentRss/327449.htmlhttp://www.aygfsteel.com/jiejinjivsn/services/trackbacks/327449.html  1、Metal风格 (默认)

  String lookAndFeel = "javax.swing.plaf.metal.MetalLookAndFeel";

  UIManager.setLookAndFeel(lookAndFeel);

  2、Windows风格

  String lookAndFeel = "com.sun.java.swing.plaf.windows.WindowsLookAndFeel";

  UIManager.setLookAndFeel(lookAndFeel);

  3、Windows Classic风格

  String lookAndFeel = "com.sun.java.swing.plaf.windows.WindowsClassicLookAndFeel";

  UIManager.setLookAndFeel(lookAndFeel);

  4、Motif风格

  String lookAndFeel = "com.sun.java.swing.plaf.motif.MotifLookAndFeel";

  UIManager.setLookAndFeel(lookAndFeel);

  5、Mac风格 (需要在相关的操作系l上方可实现)

  String lookAndFeel = "com.sun.java.swing.plaf.mac.MacLookAndFeel";

  UIManager.setLookAndFeel(lookAndFeel);

  6、GTK风格 (需要在相关的操作系l上方可实现)

  String lookAndFeel = "com.sun.java.swing.plaf.gtk.GTKLookAndFeel";

  UIManager.setLookAndFeel(lookAndFeel);

  7、可跨^台的默认风格

  String lookAndFeel = UIManager.getCrossPlatformLookAndFeelClassName();

  UIManager.setLookAndFeel(lookAndFeel);

  8、当前系l的风格

  String lookAndFeel = UIManager.getSystemLookAndFeelClassName();

  UIManager.setLookAndFeel(lookAndFeel);

  在Java中让用户能够动态地更改应用的外观,可以l用h好地体验Q具体的实现方式是:

  1Q先使用UIManager.setLookAndFeel(String s)Ҏ讑֮对应的外?/p>

  2Q再使用SwingUtilities.updateComponentTreeUI(Component c)Ҏ立刻更新应用的外?/p>

  q两个类均在javax.swing包中
相关文章博客Q?a >睫晋?/font> 睫晋?/font> 睫晋?/font> 睫晋?/font> 睫晋?/font> 睫晋?/font> 睫晋?/font> 睫晋?/font>



]]>
Java多线E支持如何才能解x口问?/title><link>http://www.aygfsteel.com/jiejinjivsn/archive/2010/07/29/327448.html</link><dc:creator>睫晋?/dc:creator><author>睫晋?/author><pubDate>Thu, 29 Jul 2010 07:59:00 GMT</pubDate><guid>http://www.aygfsteel.com/jiejinjivsn/archive/2010/07/29/327448.html</guid><wfw:comment>http://www.aygfsteel.com/jiejinjivsn/comments/327448.html</wfw:comment><comments>http://www.aygfsteel.com/jiejinjivsn/archive/2010/07/29/327448.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/jiejinjivsn/comments/commentRss/327448.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/jiejinjivsn/services/trackbacks/327448.html</trackback:ping><description><![CDATA[<p><font color="#000000">  Java多线E支持需要我们不断的q行相关问题的解冻I下面我们来看看在接口问题上的相关问题解x案,q样才能更好的进行不断的</font><a ><font color="#000000">q洗?/font></a><font color="#000000">创新和学习。希望大家有所了解?/font></p> <p><font color="#000000">  Java多线E支持,所有实现Runnable接口的类都可被启动一个新U程Q新U程会执行该实例的run()ҎQ当run()Ҏ执行完毕后,U程q束了。一旦一个线E执行完毕,q个实例׃能再重新启动Q只能重新生成一个新实例Q再启动一个新U程?/font></p> <p><font color="#000000">  ThreadcL实现了Runnable接口的一个实例,它代表一个线E的实例Qƈ且,启动U程的唯一Ҏ是通过Threadcȝstart()实例ҎQ?/font></p> <p><font color="#000000">  1.Thread t = new Thread();</font></p> <p><font color="#000000">  2.t.start();</font></p> <p><font color="#000000">  start()Ҏ是一个nativeҎQ它启动一个新U程Qƈ执行run()Ҏ。Threadc默认的run()Ҏ什么也不做退Z。注意:直接调用run()Ҏq不会启动一个新U程Q它和调用一个普通的java多线E支持方法没有什么区别?/font></p> <p><font color="#000000">  因此Q有两个Ҏ可以实现自己的线E:</font></p> <p><font color="#000000">  Ҏ1Q自qcextend ThreadQƈ复写run()ҎQ就可以启动新线Eƈ执行自己定义的run()Ҏ。例如:</font></p> <p><font color="#000000">  3.public class MyThread extends Thread {</font></p> <p><font color="#000000">  4.public run() {</font></p> <p><font color="#000000">  5.System.out.println("MyThread.run()");</font></p> <p><font color="#000000">  6.}</font></p> <p><font color="#000000">  7.}</font></p> <p><font color="#000000">  在合适的地方启动U程Qnew MyThread().start();</font></p> <p><font color="#000000">  Ҏ2Q如果自qcdlextends另一个类Q就无法直接extends ThreadQ此Ӟ必须实现一个Runnable接口Q?/font></p> <p><font color="#000000">  8.public class MyThread extends OtherClass implements Runnable {</font></p> <p><font color="#000000">  9.public run() {</font></p> <p><font color="#000000">  10.System.out.println("MyThread.run()");</font></p> <p><font color="#000000">  11.}</font></p> <p><font color="#000000">  12.}</font></p> <p><font color="#000000">  Z启动MyThreadQ需要首先实例化一个ThreadQƈ传入自己的MyThread实例Q?/font></p> <p><font color="#000000">  13.MyThread myt = new MyThread();</font></p> <p><font color="#000000">  14.Thread t = new Thread(myt);</font></p> <p><font color="#000000">  15.t.start();</font></p> <p><font color="#000000">  事实上,当传入一个Runnable target参数lThread后,Thread的run()Ҏ׃调用target.run()Q参考JDK源代码:</font></p> <p><font color="#000000">  16.public void run() {</font></p> <p><font color="#000000">  17.if (target != null) {</font></p> <p><font color="#000000">  18.target.run();</font></p> <p><font color="#000000">  19.}</font></p> <p><font color="#000000">  20.}</font></p> <p><font color="#000000">  Java多线E支持还有一些Name, ThreadGroup, isDaemon{设|,׃和线E设计模式关联很,q里׃多说了?/font></p> <img src ="http://www.aygfsteel.com/jiejinjivsn/aggbug/327448.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/jiejinjivsn/" target="_blank">睫晋?/a> 2010-07-29 15:59 <a href="http://www.aygfsteel.com/jiejinjivsn/archive/2010/07/29/327448.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>多线E开发的捷径Q构建Javaq发模型框架http://www.aygfsteel.com/jiejinjivsn/archive/2010/07/29/327447.html睫晋?/dc:creator>睫晋?/author>Thu, 29 Jul 2010 07:55:00 GMThttp://www.aygfsteel.com/jiejinjivsn/archive/2010/07/29/327447.htmlhttp://www.aygfsteel.com/jiejinjivsn/comments/327447.htmlhttp://www.aygfsteel.com/jiejinjivsn/archive/2010/07/29/327447.html#Feedback0http://www.aygfsteel.com/jiejinjivsn/comments/commentRss/327447.htmlhttp://www.aygfsteel.com/jiejinjivsn/services/trackbacks/327447.html  Java多线E特性ؓ构徏高性能的应用提供了极大的方便,但是也带来了不少的麻烦。线E间同步、数据一致性等烦琐的问题需要细心的考虑Q一不小心就会出C些微妙的Q难以调试的错误?/font>

  另外Q应用逻辑和线E逻辑U缠在一P会导致程序的逻辑l构混ؕQ难以复用和l护。本文试囄Z个解册个问题的ҎQ通过构徏一个ƈ发模型框ӞframeworkQ,使得开发多U程的应用变得容易?/font>

  基础知识

  Java语言提供了对于线E很好的支持Q实现方法小巧、优雅。对于方法重入的保护Q信号量QsemaphoreQ和临界区(critical sectionQ机制的实现都非常简z。可以很Ҏ的实现多U程间的同步操作从而保护关键数据的一致性。这些特点得Java成ؓ面向对象语言中对于多U程Ҏ支持方面的g者(C++正在试图把boost库中的对于线E的支持部分U_语言标准Q?/font>

  Java中内|了对于对象q发讉K的支持,每一个对象都有一个监视器QmonitorQ,同时只允怸个线E持有监视器从而进行对对象的访问,那些没有获得监视器的U程必须{待直到持有监视器的U程释放监视器。对象通过synchronized关键字来声明U程必须获得监视器才能进行对自己的访问?/font>

  synchronized声明仅仅对于一些较为简单的U程间同步问题比较有效,对于哪些复杂的同步问题,比如带有条g的同步问题,Java提供了另外的解决ҎQwait/notify/notifyAll?/font>

  获得对象监视器的U程可以通过调用该对象的waitҎd释放监视器,{待在该对象的线E等待队列上Q此时其他线E可以得?/font>中频点焊?/font>监视器从而访问该对象Q之后可以通过调用notify/notifyAllҎ来唤醒先前因调用waitҎ而等待的U程?/font>

  一般情况下Q对于wait/notify/notifyAllҎ的调用都是根据一定的条g来进行的Q比如:l典的生产?消费者问题中对于队列I、满的判断。熟悉POSIX的读者会发现Q用wait/notify/notifyAll可以很容易的实现POSIX中的一个线E间的高U同步技术:条g变量?/font>

  单例?/strong>

  本文围l一个简单的例子展开Q这样可以更ҎH出我们解决问题的思\、方法。本文想向读者展现的正是q些思\、方法。这些思\、方法更加适用于解军_规模、复杂应用中的ƈ发问题。考虑一个简单的例子Q我们有一个服务提供者,它通过一个接口对外提供服务,服务内容非常单,是在标准输Z打印Hello World。类l构囑֦下:

cȝ构图

  代码如下Q?/font>

  1.interface Service

  2.{

  3.    public void sayHello();

  4.}

  5.class ServiceImp implements Service

  6.{

  7.    public void sayHello() {

  8.        System.out.println("Hello World!");

  9.    }

  10.}

  11.class Client

  12.{

  13.    public Client(Service s) {

  14.        _service = s;

  15.}

  16.    public void requestService() {

  17.        _service.sayHello();

  18.    }

  19.    private Service _service;

  20.}

  如果现在有新的需求,要求该服务必L持Client的ƈ发访问。一U简单的Ҏ是在ServicImpcM的每个方法前面加上synchronized声明Q来保证自己内部数据的一致性(当然对于本例来说Q目前是没有必要的,因ؓServiceImp没有需要保护的数据Q但是随着需求的变化Q以后可能会有的Q。但是这样做臛_会存在以下几个问题:

  1.现在要维护ServiceImp的两个版本:多线E版本和单线E版本(有些地方Q比如其他项目,可能没有q发的问题)Q容易带?/font>点凸焊机同步更新和正选择版本的问题,l维护带来麻烦?/font>

  2.如果多个q发的Client频繁调用该服务,׃是直接同步调用,会造成ClientdQ降低服务质量?/font>

  3.很难q行一些灵zȝ控制Q比如:ҎClient的优先q行排队{等?/font>

  4.q些问题对于大型的多U程应用服务器尤为突出,对于一些简单的应用Q如本文中的例子Q可能根本不用考虑。本文正是要讨论q些问题的解x案,文中的简单的例子只是提供了一个说明问题,展示思\、方法的q_?/font>

  5.如何才能较好的解册些问题,有没有一个可以重用的解决Ҏ呢?让我们先把这些问题放一放,先来谈谈和框架有关的一些问题?/font>

  框架概述

  熟悉面向对象的读者一定知道面向对象的最大的优势之一是QY件复用。通过复用Q可以减很多的工作量,提高软g开发生产率。复用本w也是分层次的,代码U的复用和设计架构的复用?/font>

  大家可能非常熟悉C语言中的一些标准库Q它们提供了一些通用的功能让你的E序使用。但是这些标准库q不能媄响你的程序结构和设计思\Q仅仅是提供一些机能,帮助你的E序完成工作。它们你不必重头编写一般性的通用功能Q比如printfQ,它们的是E序代码本n的复用性,而不是设计架构的复用性?/font>

  那么什么是框架呢?所谓框Ӟ它不同于一般的标准库,是指一l紧密关联的Q类QclassesQ强调彼此的配合以完成某U可以重复运用的设计概念。这些类之间以特定的方式合作Q彼此不可或~。它们相当程度的影响了你的程序的形貌。框架本w规划了应用E序的骨qԌ让程序遵循一定的程和动U,展现一定的风貌和功能。这样就使程序员不必费力于通用性的功能的繁文缛节,集中_֊于专业领域?/font>

  有一点必要Q放之四皆准的框架是不存在的,也是最没有用处的。框架往往都是针对某个特定应用领域的,是在对这个应用领域进行深ȝ解的基础上,抽象应用的概忉|型,在这些抽象的概念上搭建的一个模型,是一个有形无体的框架。不同的具体应用Ҏ自n的特点对框架中的抽象概念q行实现Q从而赋予框架生命,完成应用的功能?/font>

  Z框架的应用都有两部分构成Q框枉分和特定应用部分。要惌到框架复用的目标Q必要做到框架部分和特定应用部分的隔离。用面向对象的一个强大功能:多态,可以实现q一炏V在框架中完成抽象概念之间的交互、关联,把具体的实现交给特定的应用来完成。其中一般都会大量用了Template Method设计模式。Java中的Collection Framework以及微Y的MFC都是框架斚w很好的例子。有兴趣的读者可以自行研I?/font>

 

  构徏框架

  如何构徏一个Javaq发模型框架呢?让我们先回到原来的问题,先来分析一下原因。造成要维护多U程和单U程两个版本的原因是׃把应用逻辑和ƈ发逻辑混在一P如果能够做到把应用逻辑和ƈ发模型进行很好的隔离Q那么应用逻辑本n可以很好的被复用,而且也很Ҏ把ƈ发逻辑dq来而不会对应用逻辑造成M影响。造成ClientdQ性能降低以及无法q行额外的控制的原因是由于所有的服务调用都是同步的,解决Ҏ很简单,改ؓ异步调用方式Q把服务的调用和服务的执行分R?/font>

  首先来介l一个概念,zd对象QActive ObjectQ。所谓活动对象是相对于被动对象(passive objectQ而言的,被动对象的方法的调用和执行都是在同一个线E中的,被动对象Ҏ的调用是同步的、阻塞的Q一般的对象都属于被动对象;d对象的方法的调用和执行是分离的,d对象有自q立的执行U程Q主动对象的上v保洁公司Ҏ的调用是由其他线E发LQ但是方法是在自qU程中执行的Q主动对象方法的调用是异步的Q非d的?/font>

  本框架的核心是使用d对象来封装ƈ发逻辑Q然后把Client的请求{发给实际的服务提供者(应用逻辑Q,q样无论是Clientq是实际的服务提供者都不用兛_q发的存在,不用考虑q发所带来的数据一致性问题。从而实现应用逻辑和ƈ发逻辑的隔,服务调用和服务执行的隔离。下面给出关键的实现l节?/font>

  本框架有如下几部分构成:

  1.一个ActiveObjectc,从Threadl承Q封装了q发逻辑的活动对象;

  2.一个ActiveQueuec,主要用来存放调用者请求;

  3.一个MethodRequest接口Q主要用来封装调用者的hQCommand设计模式的一U实现方式。它们的一个简单的实现如下Q?/font>

  1. //MethodRequest接口定义

  2.  interface MethodRequest

  3.{

  4.    public void call();

  5.}

  6.//ActiveQueue定义Q其实就是一个producer/consumer队列

  7.    class ActiveQueue

  8.{

  9.      public ActiveQueue() {

  10.        _queue = new Stack();

  11.      }

  12.    public synchronized void enqueue(MethodRequest mr) {

  13.        while(_queue.size() > QUEUE_SIZE) {

  14.            try {

  15.                   wait();

  16.            }catch (InterruptedException e) {

  17.                   e.printStackTrace();

  18.            }

  19.        }

  20.

  21.        _queue.push(mr);

  22.        notifyAll();

  23.        System.out.println("Leave Queue");

  24.    }

  25.    public synchronized MethodRequest dequeue() {

  26.        MethodRequest mr;

  27.

  28.        while(_queue.empty()) {

  29.            try {

  30.                wait();

  31.            }catch (InterruptedException e) {

  32.                e.printStackTrace();

  33.            }

  34.        }

  35.        mr = (MethodRequest)_queue.pop();

  36.        notifyAll();

  37.

  38. return mr;

  39.    }

  40.    private Stack _queue;

  41.    private final static int QUEUE_SIZE = 20;

  42.}

  43.//ActiveObject的定?/font>

  44.class ActiveObject extends Thread

  45.{

  46.    public ActiveObject() {

  47.        _queue = new ActiveQueue();

  48.        start();

  49.    }

  50.    public void enqueue(MethodRequest mr) {

  51.        _queue.enqueue(mr);

  52.    }

  53.    public void run() {

  54.        while(true) {

  55.            MethodRequest mr = _queue.dequeue();

  56.            mr.call();

  57.        }

  58.    }

  59.    private ActiveQueue _queue;

  60.}

  通过上面的代码可以看出正是这些类怺合作完成了对q发逻辑的封装。开发者只需要根据需要实现MethodRequest接口Q另外再定义一个服务代理类提供l用者,在服务代理者类中把服务调用者的h转化为MethodRequest实现Q交l活动对象即可?/font>

  使用该框Ӟ可以较好的做到应用逻辑和ƈ发模型的分离Q从而开发者集中精力于应用领域Q然后^滑的和ƈ发模型结合v来,q且可以针对ActiveQueue定制排队机制Q比如基于优先{?/font>

 

  Z框架的解x?/strong>

  本小节将使用上述的框枉新实现前面的例子Q提供对于ƈ发的支持。第一步先完成对于MethodRequest的实玎ͼ对于我们的例子来说实现如下:

  1.class SayHello implements MethodRequest

  2.{

  3.    public SayHello(Service s) {

  4.        _service = s;

  5.    }

  6.    public void call() {

  7.        _service.sayHello();

  8.    }

  9.    private Service _service;

  10.}

  该类完成了对于服务提供接口sayHelloҎ的封装。接下来定义一个服务代理类Q来完成h的封装、排队功能,当然Z做到对Client透明Q该cdd现Service接口。定义如下:

  11.class ServiceProxy implements Service

  12.{

  13.    public ServiceProxy() {

  14.        _service = new ServiceImp();

  15.        _active_object = new ActiveObject();

  16.    }

  17.

  18.    public void sayHello() {

  19.        MethodRequest mr = new SayHello(_service);

  20.        _active_object.enqueue(mr);

  21.    }

  22.    private Service _service;

  23.    private ActiveObject _active_object;

  24.}

  其他的类和接口定义不变,下面Ҏ一下ƈ发逻辑增加前后的服务调用的变化Qƈ发逻辑增加前,对于sayHello服务的调用方法:

  25.Service s = new ServiceImp();

  26.Client c = new Client(s);

  27.c.requestService();

  q发逻辑增加后,对于sayHello服务的调用方法:

  28.Service s = new  ServiceProxy();

  29.Client c = new Client(s);

  30.c.requestService();

  可以看出q发逻辑增加前后对于Client的ServiceImp都无需作Q何改变,使用方式也非怸_ServiceImp也能够独立的q行重用。类l构囑֦下:

cȝ构图

  读者容易看出,使用框架也增加了一些复杂性,对于一些简单的应用来说可能Ҏ没有必要用本框架。希望读者能够根据自q实际情况q行判断?/font>

  l论

  本文围绕一个简单的例子了如何构架一个Javaq发模型框架Q其中用了一些构建框架的常用技术,当然所构徏的框架和一些成熟的商用框架相比Q显得非常稚嫩,比如没有考虑服务调用有返回值的情况Q但是其思想Ҏ是一致的Q希望读者能够深加领会,q样无论对于构徏自己的框架还是理解一些其他的框架都是很有帮助的。读者可以对本文中的框架q行扩充Q直接应用到自己的工作中?/font>

  优点Q?/strong>

  1.增强了应用的q发性,化了同步控制的复杂性;

  2.服务的请求和服务的执行分,使得可以Ҏ务请求排队,q行灉|的控Ӟ

  3.应用逻辑和ƈ发模型分,使得E序l构清晰Q易于维护、重用;

  4.可以使开发者集中精力于应用领域?/font>

  ~点Q?/strong>

  1.׃框架所需cȝ存在Q在一定程度上增加了程序的复杂性;

  2.如果应用需要过多的zd对象Q由于线E切换开销会造成性能下降Q?/font>

  3.可能会造成调试困难?/font>



]]>
Java多线E程序设计初?/title><link>http://www.aygfsteel.com/jiejinjivsn/archive/2010/07/29/327445.html</link><dc:creator>睫晋?/dc:creator><author>睫晋?/author><pubDate>Thu, 29 Jul 2010 07:50:00 GMT</pubDate><guid>http://www.aygfsteel.com/jiejinjivsn/archive/2010/07/29/327445.html</guid><wfw:comment>http://www.aygfsteel.com/jiejinjivsn/comments/327445.html</wfw:comment><comments>http://www.aygfsteel.com/jiejinjivsn/archive/2010/07/29/327445.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/jiejinjivsn/comments/commentRss/327445.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/jiejinjivsn/services/trackbacks/327445.html</trackback:ping><description><![CDATA[<p><font color="#000000">  在Java语言产生前,传统的程序设计语a的程序同一时刻只能单Q务操作,效率非常低,例如E序往往在接收数据输入时发生dQ只有等到程序获得数据后才能l箋q行。随着Internet的迅猛发展,q种状况来不能让Z忍受Q如果网l接?/font><a ><font color="#000000">热合?/font></a><font color="#000000">数据dQ后台程序就处于{待状态而不l箋M操作Q而这U阻塞是l常会碰到的Q此时CPU资源被白白的闲置h。如果在后台E序中能够同时处理多个Q务,该多好啊Q应Internet技术而生的Java语言解决了这个问题,多线E程序是Java语言的一个很重要的特炏V在一个JavaE序中,我们可以同时q行q行多个相对独立的线E,例如Q我们如果创Z个线E来q行数据输入输出Q而创建另一个线E在后台q行其它的数据处理,如果输入输出U程在接收数据时dQ而处理数据的U程仍然在运行。多U程E序设计大大提高了程序执行效率和处理能力?/font></p> <p><font color="#000000">   U程的创?/font></p> <p><font color="#000000">  我们知道Java是面向对象的E序语言Q用Javaq行E序设计是设计和用类QJava为我们提供了U程cThread来创建线E,创徏U程与创建普通的cȝ对象的操作是一LQ而线E就是ThreadcL其子cȝ实例对象。下面是一个创建启动一个线E的语句Q?/font></p> <p><font color="#000000">  Thread thread1=new Thread(); file://声明一个对象实例,卛_Z个线E;</font></p> <p><font color="#000000">  Thread1.run(); file://用ThreadcM的run()Ҏ启动U程Q?/font></p> <p><font color="#000000">  从这个例子,我们可以通过Thread()构造方法创Z个线E,q启动该U程。事实上Q启动线E,也就是启动线E的run()ҎQ而ThreadcM的run()Ҏ没有M操作语句Q所以这个线E没有Q何操作。要使线E实现预定功能,必须定义自己的run()Ҏ。Java中通常有两U方式定?run()ҎQ?/font></p> <p><font color="#000000">  通过定义一个Threadcȝ子类Q在该子cM重写run()Ҏ。Thread子类的实例对象就是一个线E,昄Q该U程有我们自p计的U程体run()ҎQ启动线E就启动了子cM重写的run()Ҏ?/font></p> <p><font color="#000000">  通过Runnable接口Q在该接口中定义run()Ҏ的接口。所谓接口跟c非常类|主要用来实现Ҏ功能Q如复杂关系的多重承功能。在此,我们定义一个实现Runnable() 接口的类Q在该类中定义自qrun()ҎQ然后以该类的实例对象ؓ参数调用Threadcȝ构造方法来创徏一个线E?/font></p> <p><font color="#000000">  U程被实际创建后处于待命状态,Ȁz(启动Q线E就是启动线E的run()ҎQ这是通过调用U程的start()Ҏ来实现的?/font></p> <p><font color="#000000">  下面一个例子实践了如何通过上述两种Ҏ创徏U程q启动它们:</font></p> <p><font color="#000000">  // 通过Threadcȝ子类创徏的线E;</font></p> <p><font color="#000000">    { file://自定义线E的run()ҎQ?/font></p> <p><font color="#000000">   file://通过Runnable接口创徏的另外一个线E;</font></p> <p><font color="#000000">   { file://自定义线E的run()ҎQ?/font></p> <p><font color="#000000">   file://E序的主c?</font></p> <p><font color="#000000">   class Multi_Thread file://声明ȝQ?br />      plubic static void mail(String args[]) file://声明L法;</font></p> <p><font color="#000000">       thread1 threadone=new thread1(); file://用Threadcȝ子类创徏U程Q?/font></p> <p><font color="#000000">       Thread threadtwo=new Thread(new thread2()); file://用Runnable接口cȝ对象创徏U程Q?/font></p> <p><font color="#000000">       threadone.start(); threadtwo.start(); </font><a href="file://strat/"><font color="#000000">file://strat</font></a><font color="#000000">()Ҏ启动U程Q?/font></p> <p><br /> <font color="#000000">  q行该程序就可以看出Q线Ethreadone和threadtwo交替占用CPUQ处于ƈ行运行状态。可以看出,启动U程的run()Ҏ是通过调用U程的start()Ҏ来实现的(见上例中ȝ)Q调用start()Ҏ启动U程的run()Ҏ不同于一般的调用ҎQ调用一般方法时Q必ȝC般方法执行完毕才能够q回start()ҎQ而启动线E的run()Ҏ后,start()告诉pȝ该线E准备就l可以启动run()Ҏ后,p?start()Ҏ执行调用start()Ҏ语句下面的语句,q时run()Ҏ可能q在q行Q这PU程的启动和q行q行q行Q实C多Q务操作?/font></p> <p><font color="#000000">  U程的优先</font></p> <p><font color="#000000">  对于多线E程序,每个U程的重要程度是不尽相同Q如多个U程在等待获得CPU旉Ӟ往往我们需要优先高的U程优先抢占到CPU旉得以执行Q又如多个线E交替执行时Q优先军_了别高的线E得到CPU的次数多一些且旉多长一些;q样Q高优先U的U程处理的Q务效率就高一些?/font></p> <p><font color="#000000">  Java中线E的优先U从低到高以整数1~10表示Q共分ؓ10U,讄优先U是通过调用U程对象的setPriority()ҎQ如上例中,讄优先U的语句为:</font></p> <p><font color="#000000">  thread1 threadone=new thread1(); file://用Threadcȝ子类创徏U程Q?/font></p> <p><font color="#000000">  Thread threadtwo=new Thread(new thread2()); file://用Runnable接口cȝ对象创徏U程Q?/font></p> <p><font color="#000000">  threadone.setPriority(6); file://讄threadone的优先6Q?/font></p> <p><font color="#000000">  threadtwo.setPriority(3); file://讄threadtwo的优先3Q?/font></p> <p><font color="#000000">  threadone.start(); threadtwo.start(); </font><a href="file://strat/"><font color="#000000">file://strat</font></a><font color="#000000">()Ҏ启动U程Q?/font></p> <p><font color="#000000">  q样Q线Ethreadone会优先于线Ethreadtwo执行Qƈ占有更多的CPU旉。该例中Q优先讄攑֜U程启动前,也可以在启动后进行设|,以满不同的优先U需求?br />  U程的(同步Q控?/font></p> <p><font color="#000000">  一个JavaE序的多U程之间可以׃n数据。当U程以异步方式访问共享数据时Q有时候是不安全的或者不和逻辑的。比如,同一时刻一个线E在d数据Q另外一个线E在处理数据Q当处理数据的线E没有等到读?/font><a ><font color="#000000">收羃?/font></a><font color="#000000">数据的线E读取完毕就d理数据,必然得到错误的处理结果。这和我们前面提到的d数据和处理数据ƈ行多dq不矛盾Q这儿指的是处理数据的线E不能处理当前还没有dl束的数据,但是可以处理其它的数据?/font></p> <p><font color="#000000">  如果我们采用多线E同步控制机Ӟ{到W一个线E读取完数据Q第二个U程才能处理该数据,׃避免错误。可见,U程同步是多U程~程的一个相当重要的技术?/font></p> <p><font color="#000000">  在讲U程的同步控制前我们需要交代如下概念:</font></p> <p><font color="#000000">  1 用Java关键字synchonized同步对共享数据操作的Ҏ</font></p> <p><font color="#000000">  在一个对象中Q用synchonized声明的方法ؓ同步Ҏ。Java中有一个同步模?监视器,负责理U程对对象中的同步方法的讉KQ它的原理是Q赋予该对象唯一一?钥匙'Q当多个U程q入对象Q只有取得该对象钥匙的线E才可以讉K同步ҎQ其它线E在该对象中{待Q直到该U程用wait() Ҏ攑ּq把钥匙Q其它等待的U程抢占该钥匙,抢占到钥匙的U程后才可得以执行,而没有取得钥匙的U程仍被d在该对象中等待?/font></p> <p><font color="#000000">  file://声明同步的一U方式:方法声明同?/font></p> <p><font color="#000000">  class store</font></p> <p><font color="#000000">  public synchonized void store_in()</font></p> <p><font color="#000000">  public synchonized void store_out(){</font></p> <p><font color="#000000">  2 利用wait()、notify()及notifyAll()Ҏ发送消息实现线E间的相互联p?/font></p> <p><font color="#000000">  JavaE序中多个线E通过消息来实C动联pȝQ这几种Ҏ实现了线E间的消息发送。例如定义一个对象的synchonized ҎQ同一时刻只能够有一个线E访问该对象中的同步ҎQ其它线E被d。通常可以用notify()或notifyAll()Ҏ唤醒其它一个或所有线E。而用wait()Ҏ来该线E处于阻塞状态,{待其它的线E用notify()唤醒?/font></p> <p><font color="#000000">  一个实际的例子是生和销售,生单元品生产出来放在仓库中Q销售单元则从仓库中提走产品Q在q个q程中,销售单元必d仓库中有产品时才能提货;如果仓库中没有品,则销售单元必ȝ待?/font></p> <p><font color="#000000">  E序中,假如我们定义一个仓库类storeQ该cȝ实例对象q当于仓库Q在storecM定义两个成员ҎQstore_in()Q用来模拟品制造者往仓库中添加品;strore_out()Ҏ则用来模拟销售者从仓库中取C品。然后定义两个线E类Qcustomerc,其中的run()Ҏ通过调用仓库cM的store_out()从仓库中取走产品Q模拟销售者;另外一个线E类producer中的run()Ҏ通过调用仓库cM?store_in()Ҏ向仓库添加品,模拟产品刉者。在ȝ中创建ƈ启动U程Q实现向仓库中添加品或取走产品?/font></p> <p><font color="#000000">  如果仓库cM的store_in() 和store_out()Ҏ不声明同步,q就是个一般的多线E,我们知道Q一个程序中的多U程是交替执行的Q运行也是无序的Q这P可能存在这L问题Q?/font></p> <p><font color="#000000">  仓库中没有品了Q销售者还在不断光,而且q不停的??产品Q这在现实中是不可思义的,在程序中pCؓ负|如果仓库类中的stroe_in ()和store_out()Ҏ声明同步Q如上例所C:控制了同一时刻只能有一个线E访问仓库对象中的同步方法;即一个生产类U程讉K被声明ؓ同步?store_in()ҎӞ其它U程不能够讉K对象中的store_out()同步ҎQ当然也不能讉Kstore_in()Ҏ。必ȝ到该U程调用wait()Ҏ攑ּ钥匙Q其它线E才有机会访问同步方法?/font></p> <img src ="http://www.aygfsteel.com/jiejinjivsn/aggbug/327445.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/jiejinjivsn/" target="_blank">睫晋?/a> 2010-07-29 15:50 <a href="http://www.aygfsteel.com/jiejinjivsn/archive/2010/07/29/327445.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java List遍历Ҏ及其效率Ҏhttp://www.aygfsteel.com/jiejinjivsn/archive/2010/07/29/327442.html睫晋?/dc:creator>睫晋?/author>Thu, 29 Jul 2010 07:37:00 GMThttp://www.aygfsteel.com/jiejinjivsn/archive/2010/07/29/327442.htmlhttp://www.aygfsteel.com/jiejinjivsn/comments/327442.htmlhttp://www.aygfsteel.com/jiejinjivsn/archive/2010/07/29/327442.html#Feedback1http://www.aygfsteel.com/jiejinjivsn/comments/commentRss/327442.htmlhttp://www.aygfsteel.com/jiejinjivsn/services/trackbacks/327442.html  Java代码

  1.package com.zbalpha.test;

  2.

  3.import java.util.ArrayList;

  4.import java.util.Iterator;

  5.import java.util.List;

  6.

  7.public class ListTest {

  8.    public static void main(String args[]){

  9.        List<Long> lists = new ArrayList<Long>();

  10.

  11.        for(Long i=0l;i<1000000l;i++){

  12.            lists.add(i);

  13.        }

  14.

  15.        Long oneOk = oneMethod(lists);

  16.        Long twoOk = twoMethod(lists);

  17.        Long threeOk = threeMethod(lists);

  18.        Long fourOk = fourMethod(lists);

  19.

  20.        System.out.println("One:" + oneOk);

  21.        System.out.println("Two:" + twoOk);

  22.        System.out.println("Three:" + threeOk);

  23.        System.out.println("four:" + fourOk);

  24.

  25.    }

  26.

  27.    public static Long oneMethod(List<Long> lists){

  28.

  29.        Long timeStart = System.currentTimeMillis();

  30.        for(int i=0;i<lists.size();i++)    {

  31.            System.out.println(lists.get(i));

  32.        }

  33.        Long timeStop = System.currentTimeMillis();

  34.

  35.        return timeStop -timeStart ;

  36.    }

  37.

  38.    public static Long twoMethod(List<Long> lists){

  39.

  40.        Long timeStart = System.currentTimeMillis();

  41.        for(Long string : lists)    {

  42.            System.out.println(string);

  43.        }

  44.        Long timeStop = System.currentTimeMillis();

  45.

  46.        return timeStop -timeStart ;

  47.    }

  48.

  49.    public static Long threeMethod(List<Long> lists){

  50.

  51.        Long timeStart = System.currentTimeMillis();

  52.        Iterator<Long> it = lists.iterator();

  53.        while (it.hasNext())

  54.        {

  55.                System.out.println(it.next());

  56.        }

  57.        Long timeStop = System.currentTimeMillis();

  58.

  59.        return timeStop -timeStart ;

  60.    }

  61.

  62.

  63.

  64.    public static Long fourMethod(List<Long> lists){

  65.

  66.        Long timeStart = System.currentTimeMillis();

  67.        for(Iterator<Long> i = lists.iterator(); i.hasNext();)    {

  68.            System.out.println(i.next());

  69.        }

  70.        Long timeStop = System.currentTimeMillis();

  71.

  72.        return timeStop -timeStart ;

  73.    }

  74.}

  容器cd以大大提高编E效率和~程能力Q在Java2中,所有的容器都由SUN公司的Joshua Blochq行了重新设计,丰富了容器类库的功能?/font>

  Java2容器cȝ库的用途是“保存对象”Q它分ؓ两类Q?/font>

  Collection----一l独立的元素Q通常q些元素都服从某U规则。List必须保持元素特定的顺序,而Set不能有重复元素?/font>

  Map----一l成对的“键值对”对象Q即其元素是成对的对象,最典型的应用就是数据字典,q且q有其它q泛的应用。另外,Map可以q回其所有键丰胸l成的Set和其所有值组成的CollectionQ或光值对l成的SetQƈ且还可以像数l一h展多lMapQ只要让Map中键值对的每?“?#8221;是一个Map卛_?/font>

  1.q代?/font>

  q代器是一U设计模式,它是一个对象,它可以遍历ƈ选择序列中的对象Q而开发h员不需要了解该序列的底层结构。P代器通常被称?#8220;轻量U?#8221;对象Q因为创建它的代价小?/font>

  Java中的Iterator功能比较单,q且只能单向UdQ?/font>

  (1) 使用Ҏiterator()要求容器q回一个Iterator。第一ơ调用Iterator的next()ҎӞ它返回序列的W一个元素?/font>

  (2) 使用next()获得序列中的下一个元素?/font>

  (3) 使用hasNext()查序列中是否q有元素?/font>

  (4) 使用remove()P代器新返回的元素删除?/font>

  Iterator是Javaq代器最单的实现QؓList设计的ListIteratorh更多的功能,它可以从两个方向遍历ListQ也可以从List中插入和删除元素?/font>

  2.List的功能方?/font>

  List(interface): ơ序是List最重要的特点;它确保维护元素特定的序。List为Collectiond了许多方法,使得能够向List中间插入与移除元?只推?LinkedList使用)。一个List可以生成ListIteratorQ用它可以从两个方向遍历ListQ也可以从List中间插入和删除元素?/font>

  ArrayList: 由数l实现的List。它允许对元素进行快速随问,但是向List中间插入与移除元素的速度很慢。ListIterator只应该用来由后向前遍历ArrayListQ而不是用来插入和删除元素Q因比LinkedList开销要大很多?/font>

  LinkedList: 寚w序访问进行了优化Q向List中间插入与删除得开销不大Q随问则相对较慢(可用ArrayList代替)。它hҎaddFirst()?addLast()、getFirst()、getLast()、removeFirst()、removeLast()Q这些方?没有在Q何接口或基类中定义过)使得LinkedList可以当作堆栈、队列和双向队列使用?/font>

  3.Set的功能方?/font>

  Set(interface): 存入Set的每个元素必L唯一的,因ؓSet不保存重复元素。加入Set的Object必须定义equals()Ҏ以确保对象的唯一性。Set与Collection有完全一L接口。Set接口不保证维护元素的ơ序?/font>

  HashSet: 为快速查找而设计的Set。存入HashSet的对象必d义hashCode()?/font>

  TreeSet: 保持ơ序的SetQ底层ؓ树结构。用它可以从Set中提取有序的序列?/font>

  LinkedHashSet: hHashSet的查询速度Q且内部使用链表l护元素的顺?插入的次?。于是在使用q代器遍历SetӞl果会按元素插入的次序显C?/font>

  HashSet采用散列函数对元素进行排序,q是专门为快速查询而设计的QTreeSet采用U黑树的数据l构q行排序元素QLinkedHashSet内部使用散列以加快查询速度Q同时用链表维护元素的ơ序Q得看h元素是以插入的顺序保存的。需要注意的是,生成自己的类ӞSet需要维护元素的存储序Q因此要实现Comparable接口q定义compareTo()Ҏ?/font>



]]>
Java中synchronized用法http://www.aygfsteel.com/jiejinjivsn/archive/2010/07/29/327438.html睫晋?/dc:creator>睫晋?/author>Thu, 29 Jul 2010 07:31:00 GMThttp://www.aygfsteel.com/jiejinjivsn/archive/2010/07/29/327438.htmlhttp://www.aygfsteel.com/jiejinjivsn/comments/327438.htmlhttp://www.aygfsteel.com/jiejinjivsn/archive/2010/07/29/327438.html#Feedback0http://www.aygfsteel.com/jiejinjivsn/comments/commentRss/327438.htmlhttp://www.aygfsteel.com/jiejinjivsn/services/trackbacks/327438.html  在java~程思想中对synchronized的一点解?

  1、synchronized关键字的作用域有二种Q?/font>

  1Q是某个对象实例内,synchronized aMethod(){}可以防止多个U程同时讉Kq个对象的synchronizedҎQ如果一个对象有多个synchronizedҎQ只要一个线E访问了其中的一个synchronizedҎQ其它线E不能同时访问这个对象中M一个synchronizedҎQ。这Ӟ不同的对象实例的synchronizedҎ是不相干扰的。也是_其它U程照样可以同时讉K相同cȝ另一个对象实例中的synchronizedҎQ?/font>

  2Q是某个cȝ范围Qsynchronized static aStaticMethod{}防止多个U程同时讉Kq个cM的synchronized static Ҏ。它可以对类的所有对象实例v作用?/font>

  2、除了方法前用synchronized关键字,synchronized关键字还可以用于Ҏ中的某个区块中,表示只对q个区块的资源实行互斥访问。用法是: synchronized(this){/*区块*/}Q它的作用域是当前对象;

  3、synchronized关键字是不能l承的,也就是说Q基cȝҎsynchronized f(){} 在承类中ƈ不自动是synchronized f(){}Q而是变成了f(){}。承类需要你昑ּ的指定它的某个方法ؓsynchronizedҎQ?/font>

  ----------------------------------------------------------------------------

  java里面synchronized用法

  synchronized的一个简单例?/font>

  public class TextThread

  {

  /**

  * @param args

  */

  public static void main(String[] args)

  {

  // TODO 自动生成Ҏ存根

  TxtThread tt = new TxtThread();

  new Thread(tt).start();

  new Thread(tt).start();

  new Thread(tt).start();

  new Thread(tt).start();

  }

  }

  class TxtThread implements Runnable

  {

  int num = 100;

  String str = new String();

  public void run()

  {

  while (true)

  {

  synchronized(str)

  {

  if (num>0)

  {

  try

  {

  Thread.sleep(10);

  }

  catch(Exception e)

  {

  e.getMessage();

  }

  System.out.println(Thread.currentThread().getName()+ "this is "+ num--);

  }

  }

  }

  }

  }

  上面的例子中Z刉一个时间差,也就是出错的Z,使用了Thread.sleep(10)

  Java对多U程的支持与卫星电视同步机制深受大家的喜爱,g看v来用了synchronized关键字就可以L地解军_U程׃n数据同步问题。到底如何?――还得对synchronized关键字的作用q行深入了解才可定论?/font>

  ȝ说来Qsynchronized关键字可以作为函数的修饰W,也可作ؓ函数内的语句Q也是qx说的同步Ҏ和同步语句块。如果再l的分类Qsynchronized可作用于instance变量、object referenceQ对象引用)、static函数和class literals(cdU字面常?w上?/font>

  在进一步阐qC前,我们需要明几点:

  AQ无论synchronized关键字加在方法上q是对象上,它取得的锁都是对象,而不是把一D代码或函数当作锁――而且同步Ҏ很可能还会被其他U程的对象访问?/font>

  BQ每个对象只有一个锁QlockQ与之相兌?/font>

  CQ实现同步是要很大的pȝ开销作ؓ代h的,甚至可能造成死锁Q所以尽量避免无谓的同步控制?/font>

  接着来讨论synchronized用到不同地方对代码生的影响Q?/font>

  假设P1、P2是同一个类的不同对象,q个cM定义了以下几U情늚同步块或同步ҎQP1、P2都可以调用它们?/font>

  1Q?nbsp; 把synchronized当作函数修饰W时Q示例代码如下:

  Public synchronized void methodAAA()

  {

  //….

  }

  q也是同步ҎQ那q时synchronized锁定的是哪个对象呢?它锁定的是调用这个同步方法对象。也是_当一个对象P1在不同的U程中执行这个同步方法时Q它们之间会形成互斥Q达到同步的效果。但是这个对象所属的Class所产生的另一对象P2却可以Q意调用这个被加了synchronized关键字的Ҏ?/font>

  上边的示例代码等同于如下代码Q?/font>

  public void methodAAA()

  {

  synchronized (this)      //  (1)

  {

  //…..

  }

  }

  (1)处的this指的是什么呢Q它指的是调用q个Ҏ的对象,如P1。可见同步方法实质是synchronized作用于object reference。――那个拿CP1对象锁的U程Q才可以调用P1的同步方法,而对P2而言QP1q个锁与它毫不相qԌE序也可能在q种情Ş下摆脱同步机制的控制Q造成数据混ؕQ(

  2Q同步块Q示例代码如下:

  public void method3(SomeObject so)

  {

  synchronized(so)

  {

  //…..

  }

  }

  q时Q锁是soq个对象Q谁拿到q个锁谁可以运行它所控制的那D代码。当有一个明的对象作ؓ锁时Q就可以q样写程序,但当没有明确的对象作为锁Q只是想让一D代码同步时Q可以创Z个特D的instance变量Q它得是一个对象)来充当锁Q?/font>

  class Foo implements Runnable

  {

  private byte[] lock = new byte[0];  // Ҏ的instance变量

  Public void methodA()

  {

  synchronized(lock) { //… }

  }

  //…..

  }

  注:雉度的byte数组对象创徏h比M对象都经――查看编译后的字节码Q生成零长度的byte[]对象只需3条操作码Q而Object lock = new Object()则需?行操作码?/font>

  3Q将synchronized作用于static 函数Q示例代码如下:

  Class Foo

  {

  public synchronized static void methodAAA()   // 同步的static 函数

  {

  //….

  }

  public void methodBBB()

  {

  synchronized(Foo.class)   //  class literal(cdU字面常?

  }

  }

  代码中的methodBBB()Ҏ是把class literal作ؓ锁的情况Q它和同步的static函数产生的效果是一LQ取得的锁很特别Q是当前调用q个Ҏ?/font>卫星电视对象所属的c(ClassQ而不再是p个Class产生的某个具体对象了Q?/font>

  记得在《Effective Java》一书中看到q将 Foo.class?P1.getClass()用于作同步锁q不一P不能用P1.getClass()来达到锁q个Class的目的。P1指的是由FoocM生的对象?/font>

  可以推断Q如果一个类中定义了一个synchronized的static函数AQ也定义了一个synchronized 的instance函数BQ那么这个类的同一对象Obj在多U程中分别访问A和B两个ҎӞ不会构成同步Q因为它们的锁都不一栗AҎ的锁是Objq个对象Q而B的锁是Obj所属的那个Class?/font>

  结如下Q?/font>

  搞清楚synchronized锁定的是哪个对象Q就能帮助我们设计更安全的多U程E序?/font>

  q有一些技巧可以让我们对共享资源的同步讉K更加安全Q?/font>

  1Q?nbsp; 定义private 的instance变量+它的 getҎQ而不要定义public/protected的instance变量。如果将变量定义为publicQ对象在外界可以l过同步Ҏ的控制而直接取得它Qƈ改动它。这也是JavaBean的标准实现方式之一?/font>

  2Q?nbsp; 如果instance变量是一个对象,如数l或ArrayList什么的Q那上述Ҏ仍然不安全,因ؓ当外界对象通过getҎ拿到q个instance对象的引用后Q又其指向另一个对象,那么q个private变量也就变了Q岂不是很危险?q个时候就需要将getҎ也加上synchronized同步Qƈ且,只返回这个private对象的clone()――这P调用端得到的是对象副本的引用了?/font>



]]>
JDK 5.0中的泛型cd学习http://www.aygfsteel.com/jiejinjivsn/archive/2010/07/29/327433.html睫晋?/dc:creator>睫晋?/author>Thu, 29 Jul 2010 07:23:00 GMThttp://www.aygfsteel.com/jiejinjivsn/archive/2010/07/29/327433.htmlhttp://www.aygfsteel.com/jiejinjivsn/comments/327433.htmlhttp://www.aygfsteel.com/jiejinjivsn/archive/2010/07/29/327433.html#Feedback0http://www.aygfsteel.com/jiejinjivsn/comments/commentRss/327433.htmlhttp://www.aygfsteel.com/jiejinjivsn/services/trackbacks/327433.html  JDK 5.0 中增加的泛型cdQ是 Java 语言中类型安全的一ơ重要改q。但是,对于初次使用泛型cd的用h_泛型的某些方面看h可能不容易明白,甚至非常奇怪。在本月?#8220;Java 理论和实?#8221;中,Brian Goetz 分析了束~第一ơ用泛型的用户的常见陷阱。您可以通过讨论论坛与作者和其他读者分享您Ҏ文的看法。(也可以单L文顶端或底端的讨论来讉Kq个论坛。)

  表面上看hQ无法还是应用的环境Q比如容器类Q,泛型cdQ或者泛型)都类g C++ 中的模板。但是这U相似性仅限于表面QJava 语言中的泛型基本上完全在~译器中实现Q由~译器执行类型检查和cd推断Q然后生成普通的非泛型的字节码。这U实现技术称为擦除(erasureQ(~译器用泛型类型信息保证类型安全,然后在生成字节码之前其清除Q,q项技术有一些奇怪,q且有时会带来一些o惑的后果。虽然范型是 Java c走向类型安全的一大步Q但是在学习使用泛型的过E中几乎肯定会遇到头痛(有时候让人无法忍受)的问题?/p>

  注意Q本文假设您?JDK 5.0 中的范型有基本的了解?/p>

  泛型不是协变?/p>

  虽然集合看作是数组的抽象会有所帮助Q但是数l还有一些集合不具备的特D性质。Java 语言中的数组是协变的QcovariantQ,也就是说Q如?Integer 扩展?NumberQ事实也是如此)Q那么不?Integer ?NumberQ而且 Integer[] 也是 Number[]Q在要求 Number[] 的地方完全可以传递或者赋?Integer[]。(更正式地_如果 Number ?Integer 的超cdQ那?Number[] 也是 Integer[] 的超cdQ。您也许认ؓq一原理同样适用于泛型类?—?List<Number> ?List<Integer> 的超cdQ那么可以在需?List<Number> 的地方传?List<Integer>。不q的是,情况q如此?/p>

  不允许这样做有一个很充分的理由:q样做将破坏要提供的cd安全泛型。如果能够将 List<Integer> 赋给 List<Number>。那么下面的代码允许将?Integer 的内Ҏ?List<Integer>Q?/p>

  List<Integer> li = new ArrayList<Integer nike jordan 2010>();

  List<Number> ln = li; // illegal

  ln.add(new Float(3.1415));

  因ؓ ln ?List<Number>Q所以向其添?Float g是完全合法的。但是如?ln ?li 的别名,那么q就破坏了蕴含在 li 定义中的cd安全承诺 —?它是一个整数列表,q就是泛型类型不能协变的原因?/p>

  其他的协变问?/p>

  数组能够协变而泛型不能协变的另一个后果是Q不能实例化泛型cd的数l(new List<String>[3] 是不合法的)Q除非类型参数是一个未l定的通配W(new List<?>[3] 是合法的Q。让我们看看如果允许声明泛型cd数组会造成什么后果:

  List<String>[] lsa = new List<String>[10]; // illegal

  Object[] oa = lsa;  // OK because List<String> is a subtype of Object

  List<Integer> li = new ArrayList<Integer>();

  li.add(new Integer(3));

  oa[0] = li;

  String s = lsa[0].get(0);

  最后一行将抛出 ClassCastExceptionQ因样将?List<Integer> 填入本应?List<String> 的位|。因为数l协变会破坏泛型的类型安全,所以不允许实例化泛型类型的数组Q除非类型参数是未绑定的通配W,比如 List<?>Q?/p>

  构造gq?/p>

  因ؓ可以擦除功能Q所?List<Integer> ?List<String> 是同一个类Q编译器在编?List<V> 时只生成一个类Q和 C++ 不同Q。因此,在编?List<V> cLQ编译器不知?V 所表示的类型,所以它׃能像知道cL表示的具体类型那样处?List<V> cd义中的类型参敎ͼList<V> 中的 VQ?/p>

  因ؓq行时不能区?List<String> ?List<Integer>Q运行时都是 ListQ,用泛型类型参数标识类型的变量的构造就成了问题。运行时~Zcd信息Q这l泛型容器类和希望创Z护性副本的泛型cLZN?/p>

  比如泛型c?FooQ?/p>

  class Foo<T> {

  public void doSomething(T param) { ... }

  }

  在这里可以看CU模?—?与泛型有关的很多问题或者折衷ƈ非来自泛型本w,而是保持和已有代码兼容的要求带来的副作用?/p>

  泛化已有的类

  在{化现有的库类来用泛型方面没有多技巧,但与q_的情늛同,向后兼容性不会凭I来。我已经讨论了两个例子,其中向后兼容性限制了cd的泛化?/p>

  另一U不同的泛化Ҏ可能不存在向后兼定w题,q就?Collections.toArray nike shox r4(Object[])。传?toArray() 的数l有两个目的 —?如果集合_,那么可以其内容直接攑֜提供的数l中。否则,利用反射QreflectionQ创建相同类型的新数l来接受l果。如果从头开始重?Collections 框架Q那么很可能传递给 Collections.toArray() 的参C是一个数l,而是一个类文字Q?/p>

  interface Collection<E> {

  public T[] toArray(Class<T super E> elementClass);

  }

  因ؓ Collections 框架作ؓ良好c设计的例子被广泛效仿,但是它的设计受到向后兼容性约束,所以这些地方值得您注意,不要盲目效仿?/p>

  首先Q常常被h的泛?Collections API 的一个重要方面是 containsAll()、removeAll() ?retainAll() 的签名。您可能认ؓ remove() ?removeAll() 的签名应该是Q?/p>

  interface Collection<E> {

  public boolean remove(E e);  // not really

  public void removeAll(Collection<? extends E> c);  // not really

  }

  但实际上却是Q?/p>

  interface Collection<E> {

  public boolean remove(Object o);

  public void removeAll(Collection<?> c);

  }

  Z么呢Q答案同h因ؓ向后兼容性。x.remove(o) 的接口表?#8220;如果 o 包含?x 中,则删除它Q否则什么也不做?#8221;如果 x 是一个泛型集合,那么 o 不一定与 x 的类型参数兼宏V如?removeAll() 被泛化ؓ只有cd兼容时才能调用(Collection<? extends E>Q,那么在泛化之前,合法的代码序列就会变得不合法Q比如:

  // a collection of Integers

  Collection c = new HashSet();

  // a collection of Objects

  Collection r = new HashSet();

  c.removeAll(r);

  如果上述片段用直观的Ҏ泛化Q将 c 设ؓ Collection<Integer>Qr 设ؓ Collection<Object>Q,如果 removeAll() 的签名要求其参数?Collection<? extends E> 而不?no-opQ那么就无法~译上面的代码。泛型类库的一个主要目标就是不打破或者改变已有代码的语义Q因此,必须用比从头重新设计泛型所使用cdU束更弱的类型约束来定义 remove()、removeAll()、retainAll() ?containsAll()?/p>

  在泛型之前设计的cd能阻了“昄?#8221;泛型化方法。这U情况下p像上例这栯行折P但是如果从头设计新的泛型c,理解 Java cd中的哪些东西是向后兼容的l果很有意义Q这样可以避免不适当的模ѝ?/p>

  擦除的实?/p>

  因ؓ泛型基本上都是在 Java ~译器中而不是运行库中实现的Q所以在生成字节码的时候,差不多所有关于泛型类型的cd信息都被“擦掉”了。换句话_~译器生成的代码与您手工~写的不用泛型、检查程序的cd安全后进行强制类型{换所得到的代码基本相同。与 C++ 不同QList<Integer> ?List<String> 是同一个类Q虽然是不同的类型但都是 List<?> 的子cdQ与以前的版本相比,?JDK 5.0 中这是一个更重要的区别)?/p>

  擦除意味着一个类不能同时实现 Comparable<String> ?Comparable<Number>Q因Z实上两者都在同一个接口中Q指定同一?compareTo() Ҏ。声?DecimalString cM便与 String ?Number 比较g是明智的Q但对于 Java ~译器来_q相当于对同一个方法进行了两次声明Q?/p>

  public class DecimalString implements Comparable fashion cap<Number>, Comparable<String> { ... } // nope

  擦除的另一个后果是Q对泛型cd参数是用强制cd转换或?instanceof 毫无意义。下面的代码完全不会改善代码的类型安全性:

  public <T> T naiveCast(T t, Object o) { return (T) o; }

  ~译器仅仅发Z个类型未查{换警告,因ؓ它不知道q种转换是否安全。naiveCast() Ҏ实际上根本不作Q何{换,T 直接被替换ؓ ObjectQ与期望的相反,传入的对象被强制转换?Object?/p>

  擦除也是造成上述构造问题的原因Q即不能创徏泛型cd的对象,因ؓ~译器不知道要调用什么构造函数。如果泛型类需要构造用泛型cd参数来指定类型的对象Q那么构造函数应该接受类文字QFoo.classQƈ它们保存v来,以便通过反射创徏实例?/p>

  l束?/p>

  泛型?Java 语言走向cd安全的一大步Q但是泛型设施的设计和类库的泛化q未经q妥协。扩展虚拟机指o集来支持泛型被认为是无法接受的,因ؓq会?Java 厂商升?JVM 造成难以逾越的障。因此采用了可以完全在编译器中实现的擦除Ҏ。类似地Q在泛型 Java cdӞ保持向后兼容也ؓcd的泛化方式设|了很多限制Q生了一些؜q、o人沮丧的l构Q如 Array.newInstance()Q。这q泛型本n的问题,而是与语a的演化与兼容有关。但q些也得泛型学习和应用h更让惑,更加困难?/p>

]]>
JBoss Web和Tomcat的区?/title><link>http://www.aygfsteel.com/jiejinjivsn/archive/2009/12/05/304870.html</link><dc:creator>睫晋?/dc:creator><author>睫晋?/author><pubDate>Sat, 05 Dec 2009 09:46:00 GMT</pubDate><guid>http://www.aygfsteel.com/jiejinjivsn/archive/2009/12/05/304870.html</guid><wfw:comment>http://www.aygfsteel.com/jiejinjivsn/comments/304870.html</wfw:comment><comments>http://www.aygfsteel.com/jiejinjivsn/archive/2009/12/05/304870.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/jiejinjivsn/comments/commentRss/304870.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/jiejinjivsn/services/trackbacks/304870.html</trackback:ping><description><![CDATA[<p>  在Web2.0的浪潮中Q各U页面技术和框架不断涌现Qؓ服务器端的基架构提出了更高的E_性和可扩展性的要求。近q来Q作为开源中间g的全球领D,JBoss在J2EE应用服务器领域已成ؓ发展最速的应用服务器。在市场占有率和服务满意度上取得了巨大的成功Q丝毫不逊色于其它的非开源竞争对手,如WebSphere、WebLogic、Application Server。JBoss Web的诸多优性能Q正是其qؓ行的原因?/p> <p>  ZTomcat内核Q青胜于?</p> <p>  Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,技术先q、性能E_Q而且免费Q因而深受Java 爱好者的喜爱q得C部分软g开发商的认可。其q行时占用的pȝ资源,扩展性好Q且支持负蝲q与邮件服务等开发应用系l常用的功能。作Z个小型的轻量U应用服务器QTomcat在中型pȝ和ƈ发访问用户不是很多的场合下被普遍使用Q成为目前比较流行的Web 应用服务器?/p> <p>  而JBoss Web采用业界最优的开源Java Web引擎Q?JavaC֌中下载量最大,用户数最多,标准支持最完备的Tomcat内核作ؓ其Servlet容器引擎Qƈ加以审核和调优。单U的Tomcat性能有限Q在很多地方表现有欠~,如活动连接支持、静态内宏V大文g和HTTPS{。除了性能问题QTomcat的另一大缺Ҏ它是一个受限的集成q_Q仅能运行Java应用E序。企业在使用时TomcatQ往往q需同时部vApache Web Server以与之整合。此配置较ؓJ琐Q且不能保证性能的优性?/p> <p>  JBoss在Tomcat的基上,对其q行本地化,Tomcat 以内嵌的方式集成?JBoss 中。JBoss Web通过使用APR和Tomcat本地技术的混合模型来解决Tomcat的诸多不뀂؜合技术模型从最新的操作pȝ技术里提供了最好的U程和事件处理。结果,JBoss Web辑ֈ了可扩展性,性能参数匚w甚至越了本地Apache HTTP服务器或者IIS。譬如JBoss Web能够提供数据库连接池服务Q不仅支?JSP {?Java 技术,同时q支持其?Web 技术的集成Q譬?PHP?NET 两大阵营?/p> <p>  标准化是减小技术依赖风险,保护投资最好的方式。JBoss Web率先支持全系列JEE Web标准Q从Ҏ上保证了应用“一ơ开发,到处q行”的特点,使应用成品能方便地在JBoss Web和其他Java Web服务器之间轻易迁UR?/p> <p>  集多功能于一w,性能卓越</p> <p>  作ؓWeb 应用服务器中的明星品,JBoss Web服务器集多种功能于一w。其关键功能包括Q完全支持Java EE、高度的扩展性、快速的静态内容处理、群集、OpenSSL、URL重写和综合性?/p> <p>  JBoss Web服务器具有原生特性和强大的可扩展性,可支持多Uƈ非基于Java的服务器内容处理技术,可同时运行JSP, Servlet, Microsoft .NET , PHP ?CGIQؓ其提供一个单一的、高性能的企业部vq_?/p> <p>  与Tomcat 相比QJBoss Web在静态资源访问方面性能优越。JBoss Web支持两种lg模式——纯Java和Native I/O。在Nativelg的支持下Q动态运行不会受CQ何媄响,而静态资源的讉K利用了操作系l本w提供的0拯传送,CPU消耗降低,响应旉~短Q吞吐率大大提高Q؜合的q接模式支持最大达?0000个ƈ发客L的同时访问,与Apache Web服务器相当。部|于高性能的操作系l,可利用JBoss Web对纯Java和Native I/O两种模式的支持,使得应用在开发时可随时跨q_敏捷q移Q而部|于高性能的操作系l相关的Native环境。由于JBoss Web较好地解决了静态资源的讉K性能问题Q可在解x案中把它直接作ؓ强大的LVS的分发对象,和RHEL负蝲均衡pȝl合QŞ成理Z无限U性扩展的负蝲均衡场景?/p> <p>  OpenSSL是业界最为快速和安全的开源传输组Ӟ可借助操作pȝ和硬件的Ҏ实现高效的安全承蝲。JBoss Web集成了OpenSSLQ可提供高效的安全传输服务,使得安全机制更上台阶。研I表明, JBoss Web中的SSL性能比单U的Tomcat快四倍?/p> <p>  URL重写功能可羃短URLQ隐藏实际\径提高安全性,易于用户记忆和键入,及被搜烦引擎收录。Tomcat 不具备URL重写功能QJBoss Web则可提供一个灵zȝURL rewriting操作引擎Q支持无限个规则数和规则条g。URL可被重写以支持遗留的URL错误处理Q或应对服务器不时生的其他问题?/p> <p>  JBoss Web既可单独q行Q也可无~嵌入JBoss应用服务器,成ؓJBoss中间件^台的一部分。不仅后台服务调用的性能得以提升,也可利用以下JBossq_的特性提升Web应用功能Q?/p> <p>  ZJGroups的多U集方案的支持</p> <p>  ZArjuna技术的JTA和JTS的事务处理支?/p> <p>  优化的线E池和连接池的支?/p> <p>  ZJMX 控制台的基本理支持和JBoss On的高U管理维护支?/p> <p>  ZJBoss AOP技术的面向斚w架构的支?/p> <p>  Hibernate服务lg的支?/p> <p>  专业团队支持</p> <p>  业界大多数开源品在技术方面富于创新性,但在可持l性,产品生命周期规划Q以及质量保证方面缺乏有效保障,Y仉成商和最l用h诟病。红帽所力行?#8220;专业化开源技?#8221;则完解决了q一问题?/p> <p>  来自开源社区的JBoss WebQ在U帽专业化开源的锤炼下,在性能、扩展性、稳定性、安全性等斚wQ已成ؓ一个达C业Q甚至电信标准的优U产品。红帽不仅有专职的技术团队投入JBoss Web的开发,而且具备专门的QA团队Z品作质量保证。完善的集成试和兼Ҏ测试保证了JBoss Web自n的稳定性,q保证了它的后向兼容和其他JBoss产品协作良好的互操作性?/p> <p>  在服务体pM障方面,JBoss 开拓了以品专家提供的专家U支持服务作为开源Y件强大后盄软g生态模式。公总及庞大的 JBoss 授权服务合作伙伴|络可ؓ包括JBoss Web在内的整个JEMS 产品套g提供全面的支持服务。与Tomcat相比QJBoss Web 可提供迁UL务与现场专家服务Q在q移服务斚wQ专家指导应用可从Tomcat向JBoss Webq移Q省时省力。独特的服务订阅模式Q全力保障Y件生命周期,让企业高枕无忧?/p> <img src ="http://www.aygfsteel.com/jiejinjivsn/aggbug/304870.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/jiejinjivsn/" target="_blank">睫晋?/a> 2009-12-05 17:46 <a href="http://www.aygfsteel.com/jiejinjivsn/archive/2009/12/05/304870.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank">̨</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ӽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ʲ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ϫ</a>| <a href="http://" target="_blank">Ϫ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ͨ</a>| <a href="http://" target="_blank">²</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank">Ƽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ĵ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ľ</a>| <a href="http://" target="_blank">Ҧ</a>| <a href="http://" target="_blank">DZ</a>| <a href="http://" target="_blank">̨</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ӯ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ϫ</a>| <a href="http://" target="_blank">̴</a>| <a href="http://" target="_blank"></a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>