??xml version="1.0" encoding="utf-8" standalone="yes"?>美日韩黄色大片,亚洲aaaaaa,91网页在线看http://www.aygfsteel.com/endisoft/I believe I can fly,I can touch the skyzh-cnSat, 05 Jul 2025 07:37:40 GMTSat, 05 Jul 2025 07:37:40 GMT60做什么技术工资最高?http://www.aygfsteel.com/endisoft/archive/2006/09/29/72715.htmlEndisoftEndisoftFri, 29 Sep 2006 01:01:00 GMThttp://www.aygfsteel.com/endisoft/archive/2006/09/29/72715.htmlhttp://www.aygfsteel.com/endisoft/comments/72715.htmlhttp://www.aygfsteel.com/endisoft/archive/2006/09/29/72715.html#Feedback0http://www.aygfsteel.com/endisoft/comments/commentRss/72715.htmlhttp://www.aygfsteel.com/endisoft/services/trackbacks/72715.html看看indeed.com的数据:(x)
 (tng)
1Q?strong> (tng) 做什么语a收入最高?
http://www.indeed.com/salary?q1=lisp&l1=&q2=c%2B%2B&l2=&q3=java&l3=&q4=c%23&l4=&q5=python&l5=&q6=ruby&l6=&q7=smalltalk&l7=&q8=cobol&l8=&q9=Perl&l9=&q10=Erlang&l10=&q11=Prolog&l11=&q12=C&l12=&q13=Ada&l13=&tm=1
 (tng)
每次最多比?3U语a。于是我把没有数据的Erlang换成OCamlQ军Ҏ(gu)用的Ada换成HaskellQ和不知道中国有谁用的Prolog换成AssemblyQ把C换成Visual Basic, 把Cobol换成Delphi:
http://www.indeed.com/salary?q1=lisp&l1=&q2=c%2B%2B&l2=&q3=java&l3=&q4=c%23&l4=&q5=python&l5=&q6=ruby&l6=&q7=smalltalk&l7=&q8=Delphi&l8=&q9=Perl&l9=&q10=OCaml&l10=&q11=Assembly&l11=&q12=Visual+Basic&l12=&q13=Haskell&l13=&tm=1
 (tng)
OCaml和Haskell很惨哈?/div>
 (tng)
Web开发呢Q?a >http://www.indeed.com/salary?q1=php&l1=&q2=ruby+on+rails&l2=&q3=javascript&l3=&q4=xhtml&l4=&q5=flex&l5=&q6=openlaslo&l6=&q7=flash&l7=&q8=coldfusion&l8=&q9=jsp&l9=&q10=asp&l10=&q11=asp.net&l11=&q12=vbscript&l12=&tm=1
 (tng)
 (tng)
 (tng)
做RTOS的老大们可以笑?jin)?/div>
 (tng)
3Q?/span> 做什么技术收入高
比较搞笑的是grid computing?0000Q?低于贫困U啊。搞q行计算的灰常牛哈。这个跟若干大公司开?位数工资误搞定CELL架构QPlayStation3用的处理器就是CellQ下的编译器的高手一致哈?/div>
 (tng)
学过l计的老大们不要怒。俺知道Q俺知道Q中|均|hI间Q标准偏差,l计分布Q曲U不对称E度QskewQ,旉片,数据重合处理Q噪x(chng)除。。。等{都没有。数据没有说服力。玩儿玩儿而已Q博君一W?/div>

 (tng)再加几个具体技术,比如SAS和Matlab。小问题Qؓ(f)什么matlab那么牛B嗫?

个h以ؓ(f)Q很多要matlab的职位是华尔街上的quants一cȝ工作。也是_(d)不在于你matlab玩儿得多转,而在于你数学多牛。好比用相机Q不在于你自q机的说明书多熟,而在于你Ҏ(gu)p术的把握?/div>


Endisoft 2006-09-29 09:01 发表评论
]]>单态设计模?/title><link>http://www.aygfsteel.com/endisoft/archive/2006/09/27/72178.html</link><dc:creator>Endisoft</dc:creator><author>Endisoft</author><pubDate>Wed, 27 Sep 2006 01:11:00 GMT</pubDate><guid>http://www.aygfsteel.com/endisoft/archive/2006/09/27/72178.html</guid><wfw:comment>http://www.aygfsteel.com/endisoft/comments/72178.html</wfw:comment><comments>http://www.aygfsteel.com/endisoft/archive/2006/09/27/72178.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/endisoft/comments/commentRss/72178.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/endisoft/services/trackbacks/72178.html</trackback:ping><description><![CDATA[ <font size="2">设计模式之Singleton(单? </font> <p> <font size="2"> <strong>单态定?/strong>:<br />Singleton模式主要作用是保证在Java应用E序中,一个类Class只有一个实例存在?</font> </p> <p> <font size="2">在很多操作中Q比如徏立目?数据库连接都需要这L(fng)单线E操作?/font> </p> <p> <font size="2">q有, singleton能够被状态化; q样Q多个单态类在一起就可以作ؓ(f)一个状态仓库一样向外提供服务,比如Q你要论坛中的帖子计数器Q每ơ浏览一ơ需要计敎ͼ单态类能否保持住这个计敎ͼq且能synchronize的安全自动加1Q如果你要把q个数字怹保存到数据库Q你可以在不修改单态接口的情况下方便的做到?/font> </p> <p> <font size="2">另外斚wQSingleton也能够被无状态化。提供工h质的功能,<br /><br />Singleton模式׃ؓ(f)我们提供?jin)这样实现的可能。用Singleton的好处还在于可以节省内存Q因为它限制?jin)实例的个数Q有利于Java垃圾回收Qgarbage collectionQ?br /><br />我们常常看到工厂模式中类装入?class loader)中也用Singleton模式实现?因ؓ(f)被装入的cd际也属于资源?br /></font> </p> <p> <font size="2"> <strong>如何使用?</strong> <br />一般Singleton模式通常有几UŞ?</font> </p> <table cellspacing="3" cellpadding="3" width="100%" border="0"> <tbody> <tr> <td bgcolor="#cccccc"> <p> <font size="2">public class Singleton {</font> </p> <p> <font size="2">  private Singleton(){}</font> </p> <p> <font size="2">  //在自己内部定义自׃个实例,是不是很奇怪?<br />  //注意q是private 只供内部调用</font> </p> <p> <font size="2">  private static Singleton instance = new Singleton();</font> </p> <p> <font size="2">  //q里提供?jin)一个供外部讉K本class的静(rn)态方法,可以直接讉K  <br />  public static Singleton getInstance() {<br />    return instance;   <br />   } <br />} (tng) (tng)</font> </p> </td> </tr> </tbody> </table> <p> <font size="2">W二UŞ?</font> </p> <table cellspacing="3" cellpadding="3" width="100%" border="0"> <tbody> <tr> <td bgcolor="#cccccc"> <font size="2">public class Singleton { </font> <p> <font size="2">  private static Singleton instance = null;<br /><br />  public static synchronized Singleton getInstance() {<br /><br />  //q个Ҏ(gu)比上面有所改进Q不用每ơ都q行生成对象Q只是第一ơ     <br />  //使用时生成实例,提高?sh)(jin)效率?br />  if (instance==null)<br />    instanceQnew Singleton();<br />  return instance;   } </font> </p> <p> <font size="2">} (tng) (tng)</font> </p> </td> </tr> </tbody> </table> <p> <font size="2">使用Singleton.getInstance()可以讉K单态类?/font> </p> <p> <font size="2">上面W二中Ş式是lazy initializationQ也是说第一ơ调用时初始SingletonQ以后就不用再生成了(jin)?/font> </p> <p> <font size="2">注意到l(f)azy initialization形式中的synchronizedQ这个synchronized很重要,如果没有synchronizedQ那么用getInstance()是有可能得到多个Singleton实例。关于lazy initialization的Singleton有很多涉?qing)double-checked locking (DCL)的讨论,有兴者进一步研I?/font> </p> <p> <font size="2">一般认为第一UŞ式要更加安全些?br /></font> </p> <p> <font size="2"> <strong>使用Singleton注意事项</strong>Q?br />有时在某些情况下Q用Singletonq不能达到Singleton的目的,如有多个Singleton对象同时被不同的c装入器装蝲Q在EJBq样的分布式pȝ中用也要注意这U情况,因ؓ(f)EJB是跨服务器,跨JVM的?/font> </p> <p> <font size="2">我们以SUN公司的宠物店源码(Pet Store 1.3.1)的ServiceLocatorZE微分析一下:(x)<br /><br />在Pet Store中ServiceLocator有两U,一个是EJB目录下;一个是WEB目录下,我们(g)查这两个ServiceLocator?x)发现内容差不多Q都是提供EJB的查询定位服务,可是Z么要分开呢?仔细研究对这两种ServiceLocator才发现区别:(x)在WEB中的ServiceLocator的采取Singleton模式QServiceLocator属于资源定位Q理所当然应该使用Singleton模式。但是在EJB中,Singleton模式已经失去作用Q所以ServiceLocator才分成两U,一U面向WEB服务的,一U是面向EJB服务的?/font> </p> <p> <font size="2">Singleton模式看v来简单,使用Ҏ(gu)也很方便Q但是真正用好,是非怸Ҏ(gu)Q需要对Java的类 U程 内存{概忉|相当的了(jin)解?/font> </p> <p> <font size="2">MQ如果你的应用基于容器,那么Singleton模式用或者不用,可以使用相关替代技术?/font> </p> <img src ="http://www.aygfsteel.com/endisoft/aggbug/72178.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/endisoft/" target="_blank">Endisoft</a> 2006-09-27 09:11 <a href="http://www.aygfsteel.com/endisoft/archive/2006/09/27/72178.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>什么是Spring,Spring能干吗?http://www.aygfsteel.com/endisoft/archive/2006/09/26/72140.htmlEndisoftEndisoftTue, 26 Sep 2006 15:31:00 GMThttp://www.aygfsteel.com/endisoft/archive/2006/09/26/72140.htmlhttp://www.aygfsteel.com/endisoft/comments/72140.htmlhttp://www.aygfsteel.com/endisoft/archive/2006/09/26/72140.html#Feedback0http://www.aygfsteel.com/endisoft/comments/commentRss/72140.htmlhttp://www.aygfsteel.com/endisoft/services/trackbacks/72140.html单一?是一个容? (tng)什么容?容纳什?是对?或者说bean的容?
那ؓ(f)什么叫轻量U容器呢?相对于EJB (tng)container,使用spring不需要写W合容器规范的代?卛_器不?侵入"?jin)你的代?

q个容器?x)提供你的应?E序)中用到的所有对?q对q些对象q行l一的生命周期管理和l装.在通常的开发中,我们在需要某个对象的时候只是?tng)new (tng)MyObject(). (tng)在Java?q样没有什么不?因ؓ(f)gc?x)打理?善后"工作,是系l? (tng)而用spring,在需要某个对象时,只要向容器请求相应的对象,spring?x)找到ƈ准备好这些对象ƈ提供l你.她也?x)打理?善后"工作,但是是在应用U的.
另一斚w,springq(sh)(x)帮助你打理对象之间的依赖关系.
比如原来的做?

class (tng)A{
}
class (tng)B{
 (tng) (tng)A (tng)a (tng);
 (tng) (tng)public (tng)B(){ (tng)a (tng)= (tng)new (tng)A();}
}

而用spring的做?br />class (tng)A{
}
class (tng)B{
 (tng) (tng)A (tng)a;
 (tng) (tng)public (tng)B(){}
 (tng) (tng)void (tng)setA(A (tng)a){this.a=a}
 (tng) (tng)A (tng)getA(){return (tng)this.a}
}
(希望你不要单U地认ؓ(f)spring?x)写很多代?
但从前一个方?你可能觉得spring只是一个对象容?从这里你应该看?spring是bean容器,因ؓ(f)spring需要你的类W合bean规范:相应于每一个成员域,都需要提供setter和getterҎ(gu).spring要用这些方法来注入依赖关系,也就是?tng)dependence (tng)injection, (tng)或者inversion (tng)of (tng)control. (tng)我个得还是di更容易理?直到现在我还是要考虑怎么d别h很好的解释ioc.控制反{(倒{),我的理解是就如同上面的两个例子里看到?依赖(控制)不在体现在代码逻辑?如第一个例?,而是在配|文仉,而在代码中我们只提供注入?也就是setter和getter).

希望我对IoC的概늚讲解能够l你一些启?
你可能要问了(jin),Z么我要这样做?原来的做法有什么不妥的地方?没有什么不?只是两种理念而已,没有l对的好q是不好,但我q是l你我的解释--我理解的IoC的好?希望有所帮助.通常在程序设计的时?我们在需要某些功能时,?x)相应的去设计一些方?然后Ҏ(gu)OOdҎ(gu)和一成员变量l成一个类.实际?我们最l设计出的程序是:一l类的实例互怺互完成某个特定的d.
除了(jin)一些核?j)的业务?gu),以外我们q要做组装对象的工作.比如我有?jin)一个工?里面有很多机?机器在开动时要装配相应的模具.那么在工厂的生q程? (tng)首先我要有工?机器,模具q样三个c?然后我的"动作"?装配,开?通常的做法我们要做装?然后再去开?而用spring,我们只是专注于开?q样我们把装配q个动作抽离Z(jin)核心(j)?生q程".当某些机器改变(sh)(jin)装配模具?不在需要修Ҏ(gu)?j)业务代?q就是解??

public (tng)class (tng)Production{
 (tng) (tng)public (tng)static (tng)void (tng)main(String[] (tng)args){
 (tng) (tng) (tng) (tng)Factory (tng)factory (tng)= (tng)(Factory)BeanFactory.getBean("factory");
 (tng) (tng) (tng) (tng)factory.launchProduction();
 (tng) (tng)}
}

class (tng)Factory{
 (tng) (tng)Machine (tng)machine1,machine2;
 (tng) (tng)void (tng)launchProduction(){
 (tng) (tng) (tng) (tng) (tng)machine1.start(); (tng)machine2.start();
 (tng) (tng)}
 (tng) (tng)// (tng)setters (tng)and (tng)getters
}

class (tng)Machine{
 (tng) (tng)Tool (tng)tool;
 (tng) (tng)void (tng)start(){
 (tng) (tng)}
 (tng) (tng)// (tng)setters (tng)and (tng)getters
}

在launchProduction()Ҏ(gu)中只需要开动每台机器即?而不需要每ơ都装配机器.装配的工作交l了(jin)别h.现在只要按下start按钮.生񔞮开始了(jin)!要是原来:

void (tng)launchProduction(){
 (tng) (tng)machine1 (tng)= (tng)new (tng)MachineA();
 (tng) (tng)machine1.setTool(new (tng)ToolA());
 (tng) (tng)machine2 (tng)= (tng)new (tng)MachineB();
 (tng) (tng)machine2.setTool(new (tng)ToolB());
 (tng) (tng)machine1.start();
 (tng) (tng)machine2.start();
}

q就是工作分?是不是感觉轻松了(jin)许多?从此以后,我们都是面向构gd?而不需要过多地在代码中体现构g之间的依赖关p?

AOP
推荐你看一?lt;<effective (tng)enterprise (tng)java>>的第一?对AOP有很清晰,易懂的解?其实AOPq很艰深晦涩的概念,但是从架构角度去理解她的重要性可能不是我q样的new (tng)fish一时半?x)儿可以领(zhn)到?
我这里只是想?有些概念你要知道是怎么回事,但理解到多深,除了(jin)天赋以外更多的是l验和?zhn)?所以不要心(j)?--像是在自我解?
也许在不知不觉中你就使用?jin)很多AOP的概?比如servlet里的filter,比如在写一个commandcL,l她的调用类在每ơ调用command时前后加?preProcess和postProcess...
我不惌释太?<<eej>>的解释已l?


Endisoft 2006-09-26 23:31 发表评论
]]>
Java多线E程序设计详l解?/title><link>http://www.aygfsteel.com/endisoft/archive/2006/09/21/71209.html</link><dc:creator>Endisoft</dc:creator><author>Endisoft</author><pubDate>Thu, 21 Sep 2006 14:46:00 GMT</pubDate><guid>http://www.aygfsteel.com/endisoft/archive/2006/09/21/71209.html</guid><wfw:comment>http://www.aygfsteel.com/endisoft/comments/71209.html</wfw:comment><comments>http://www.aygfsteel.com/endisoft/archive/2006/09/21/71209.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/endisoft/comments/commentRss/71209.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/endisoft/services/trackbacks/71209.html</trackback:ping><description><![CDATA[ <p>一、理解多U程</p> <p>  多线E是q样一U机Ӟ它允许在E序中ƈ发执行多个指令流Q每个指令流都称Z个线E,彼此间互相独立?/p> <p>  U程又称量q程Q它和进E一h有独立的执行控制Q由操作pȝ负责调度Q区别在于线E没有独立的存储I间Q而是和所属进E中的其它线E共享一个存储空_(d)q得线E间的通信q较q程单?/p> <p>  多个U程的执行是q发的,也就是在逻辑上“同时”,而不是否是物理上的“同时”。如果系l只有一个CPUQ那么真正的“同时”是不可能的Q但是由于CPU的速度非常快,用户感觉不到其中的区别,因此我们也不用关?j)它Q只需要设惛_个线E是同时执行卛_?/p> <p>  多线E和传统的单U程在程序设计上最大的区别在于Q由于各个线E的控制彼此独立,使得各个U程之间的代码是乱序执行的,由此带来的线E调度,同步{问题,在以后探讨?/p> <p>  二、在Java中实现多U程</p> <p>  我们不妨设想Qؓ(f)?jin)创Z个新的线E,我们需要做些什么?很显?dng)我们必须指明q个U程所要执行的代码Q而这是在Java中实现多U程我们所需要做的一切!</p> <p>  真是奇QJava是如何做到这一点的Q通过c!作ؓ(f)一个完全面向对象的语言QJava提供?jin)类java.lang.Thread来方便多U程~程Q这个类提供?jin)大量的?gu)来方便我们控制自q各个U程Q我们以后的讨论都将围绕q个c进行?/p> <p>  那么如何提供l?Java 我们要线E执行的代码呢?让我们来看一?Thread cRThread cL重要的方法是run()Q它为ThreadcȝҎ(gu)start()所调用Q提供我们的U程所要执行的代码。ؓ(f)?jin)指定我们自q代码Q只需要覆盖它Q?/p> <p>  Ҏ(gu)一Q(h)?Thread c,覆盖Ҏ(gu) run()Q我们在创徏?Thread cȝ子类中重?run() ,加入U程所要执行的代码卛_。下面是一个例子:(x)</p> <p>  public class MyThread extends Thread<br />  {<br />  int count= 1, number;<br />  public MyThread(int num)<br />  {<br />  number = num;<br />  System.out.println<br />  ("创徏U程 " + number);<br />  }<br />  public void run() {<br />  while(true) {<br />  System.out.println<br />  ("U程 " + number + ":计数 " + count);<br />  if(++count== 6) return;<br />  }<br />  }<br />  public static void main(String args[])<br />  {<br />  for(int i = 0;<br />  i ?5; i++) new MyThread(i+1).start();<br />  }<br />  }<br />  <br />  q种Ҏ(gu)单明?jin),W合大家的习(fn)惯,但是Q它也有一个很大的~点Q那是如果我们的类已经从一个类l承Q如程序必ȝ(h)承自 Applet c)(j)Q则无法再(h)?Thread c,q时如果我们又不惛_立一个新的类Q应该怎么办呢Q?/p> <p>  我们不妨来探索一U新的方法:(x)我们不创建Threadcȝ子类Q而是直接使用它,那么我们只能我们的Ҏ(gu)作ؓ(f)参数传递给 Thread cȝ实例Q有点类似回调函数。但?Java 没有指针Q我们只能传递一个包含这个方法的cȝ实例?/p> <p>  那么如何限制q个cdd含这一Ҏ(gu)呢?当然是用接口!Q虽然抽象类也可满Q但是需要(h)承,而我们之所以要采用q种新方法,不就是ؓ(f)?jin)避免?h)承带来的限制吗?Q?/p> <p>  Java 提供?jin)接?java.lang.Runnable 来支持这U方法?/p> <p>  Ҏ(gu)二:(x)实现 Runnable 接口</p> <p>  Runnable接口只有一个方法r(sh)un()Q我们声明自qcd现Runnable接口q提供这一Ҏ(gu)Q将我们的线E代码写入其中,完成了(jin)q一部分的Q务。但是Runnable接口q没有Q何对U程的支持,我们q必d建Threadcȝ实例Q这一炚w过Threadcȝ构造函?public Thread(Runnable target);来实现。下面是一个例子:(x)</p> <p>  public class MyThread implements Runnable<br />  {<br />  int count= 1, number;<br />  public MyThread(int num)<br />  {<br />  number = num;<br />  System.out.println("创徏U程 " + number);<br />  }<br />  public void run()<br />  {<br />  while(true)<br />  {<br />  System.out.println<br />  ("U程 " + number + ":计数 " + count);<br />  if(++count== 6) return;<br />  }<br />  }<br />  public static void main(String args[])<br />  {<br />  for(int i = 0; i ?5;<br />  i++) new Thread(new MyThread(i+1)).start();<br />  }<br />  }<br />  <br />  严格地说Q创建Thread子类的实例也是可行的Q但是必L意的是,该子cdL有覆?Thread cȝ run Ҏ(gu)Q否则该U程执行的将是子cȝ run Ҏ(gu)Q而不是我们用以实现Runnable 接口的类?run Ҏ(gu)Q对此大家不妨试验一下?/p> <p>  使用 Runnable 接口来实现多U程使得我们能够在一个类中包Ҏ(gu)有的代码Q有利于装Q它的缺点在于,我们只能使用一套代码,若想创徏多个U程q各个U程执行不同的代码,则仍必须额外创徏c,如果q样的话Q在大多数情况下也许q(sh)如直接用多个cd别(h)?Thread 来得紧凑?/p> <p>  lg所qͼ两种Ҏ(gu)各有千秋Q大家可以灵z运用?/p> <p>  下面让我们一h研究一下多U程使用中的一些问题?/p> <p>  三、线E的四种状?/p> <p>  1. 新状态:(x)U程已被创徏但尚未执行(start() 未被调用)(j)?/p> <p>  2. 可执行状态:(x)U程可以执行Q虽然不一定正在执行。CPU 旉随时可能被分配给该线E,从而得它执行?/p> <p>  3. M状态:(x)正常情况?run() q回使得U程M。调?stop()?destroy() 亦有同样效果Q但是不被推荐,前者会(x)产生异常Q后者是强制l止Q不?x)释N?/p> <p>  4. d状态:(x)U程不会(x)被分?CPU 旉Q无法执行?/p> <p>  四、线E的优先U?/p> <p>  U程的优先代表该线E的重要E度Q当有多个线E同时处于可执行状态ƈ{待获得 CPU 旉ӞU程调度pȝҎ(gu)各个U程的优先来决定给谁分?CPU 旉Q优先高的U程有更大的Z(x)获得 CPU 旉Q优先低的U程也不是没有机?x),只是Z(x)要小一些Ş?jin)?/p> <p>  你可以调?Thread cȝҎ(gu) getPriority() ?setPriority()来存取线E的优先U,U程的优先界于1(MIN_PRIORITY)?0(MAX_PRIORITY)之间Q缺省是5(NORM_PRIORITY)?/p> <p>  五、线E的同步</p> <p>  ׃同一q程的多个线E共享同一片存储空_(d)在带来方便的同时Q也带来?jin)访问冲H这个严重的问题。Java语言提供?jin)专门机制以解决q种冲突Q有效避免了(jin)同一个数据对象被多个U程同时讉K?/p> <p>  ׃我们可以通过 private 关键字来保证数据对象只能被方法访问,所以我们只需针对Ҏ(gu)提出一套机Ӟq套机制是 synchronized 关键字,它包括两U用法:(x)synchronized Ҏ(gu)?synchronized 块?/p> <p>  1. synchronized Ҏ(gu)Q通过在方法声明中加入 synchronized关键字来声明 synchronized Ҏ(gu)。如Q?/p> <p>  public synchronized void accessVal(int newVal);<br />  <br />   synchronized Ҏ(gu)控制对类成员变量的访问:(x)每个cd例对应一把锁Q每?synchronized Ҏ(gu)都必获得调用该Ҏ(gu)的类实例的锁方能执行Q否则所属线E阻塞,Ҏ(gu)一旦执行,q占该锁,直到从该Ҏ(gu)q回时才锁释放Q此后被d的线E方能获得该锁,重新q入可执行状态?/p> <p>  q种机制保?jin)同一时刻对于每一个类实例Q其所有声明ؓ(f) synchronized 的成员函C臛_只有一个处于可执行状态(因ؓ(f)臛_只有一个能够获得该cd例对应的锁)(j)Q从而有效避免了(jin)cL员变量的讉K冲突Q只要所有可能访问类成员变量的方法均被声明ؓ(f) synchronizedQ?/p> <p>  ?Java 中,不光是类实例Q每一个类也对应一把锁Q这h们也可将cȝ?rn)态成员函数声明ؓ(f) synchronized Q以控制其对cȝ?rn)态成员变量的讉K?/p> <p>  synchronized Ҏ(gu)的缺P(x)若将一个大的方法声明ؓ(f)synchronized 会(x)大大影响效率Q典型地Q若线E类的方?run() 声明?synchronized Q由于在U程的整个生命期内它一直在q行Q因此将D它对本类M synchronized Ҏ(gu)的调用都永远不会(x)成功。当然我们可以通过访问类成员变量的代码放C门的Ҏ(gu)中,其声明?synchronized Qƈ在主Ҏ(gu)中调用来解决q一问题Q但?Java 为我们提供了(jin)更好的解军_法,那就?synchronized 块?/p> <p>  2. synchronized 块:(x)通过 synchronized关键字来声明synchronized 块。语法如下:(x)</p> <p>  synchronized(syncObject)<br />  {<br />  //允许讉K控制的代?br />  }<br />  <br />  synchronized 块是q样一个代码块Q其中的代码必须获得对象 syncObject Q如前所qͼ可以是类实例或类Q的锁方能执行,具体机制同前所q。由于可以针对Q意代码块Q且可Q意指定上锁的对象Q故灉|性较高?/p> <p>  六、线E的d</p> <p>  Z(jin)解决对共享存储区的访问冲H,Java 引入?jin)同步机Ӟ现在让我们来考察多个U程对共享资源的讉KQ显然同步机制已l不够了(jin)Q因为在L时刻所要求的资源不一定已l准备好?jin)被讉KQ反q来Q同一时刻准备好了(jin)的资源也可能不止一个。ؓ(f)?jin)解册U情况下的访问控刉题,Java 引入?jin)对d机制的支持?/p> <p>  d指的是暂停一个线E的执行以等待某个条件发生(如某资源qAQ,学过操作pȝ的同学对它一定已l很熟?zhn)了(jin)。Java 提供?jin)大量方法来支持dQ下面让我们逐一分析?/p> <p>  1. sleep() Ҏ(gu)Qsleep() 允许指定以毫Uؓ(f)单位的一D|间作为参敎ͼ它得线E在指定的时间内q入d状态,不能得到CPU 旉Q指定的旉一q,U程重新q入可执行状态。典型地Qsleep() 被用在等待某个资源就l的情ŞQ测试发现条件不满后,让线E阻塞一D|间后重新试Q直到条件满ؓ(f)止?/p> <p>  2. suspend() ?resume() Ҏ(gu)Q两个方法配套用,suspend()使得U程q入d状态,q且不会(x)自动恢复Q必d对应的resume() 被调用,才能使得U程重新q入可执行状态。典型地Qsuspend() ?resume() 被用在等待另一个线E生的l果的情形:(x)试发现l果q没有生后Q让U程dQ另一个线E生了(jin)l果后,调用 resume() 使其恢复?/p> <p>  3. yield() Ҏ(gu)Qyield() 使得U程攑ּ当前分得?CPU 旉Q但是不使线E阻塞,即线E仍处于可执行状态,随时可能再次分得 CPU 旉。调?yield() 的效果等价于调度E序认ؓ(f)该线E已执行?jin)够的旉从而{到另一个线E?/p> <p>  4. wait() ?notify() Ҏ(gu)Q两个方法配套用,wait() 使得U程q入d状态,它有两种形式Q一U允许指定以毫秒为单位的一D|间作为参敎ͼ另一U没有参敎ͼ前者当对应?notify() 被调用或者超出指定时间时U程重新q入可执行状态,后者则必须对应?notify() 被调用?/p> <p>  初看h它们?suspend() ?resume() Ҏ(gu)Ҏ(gu)有什么分别,但是事实上它们是截然不同的。区别的核心(j)在于Q前面叙q的所有方法,d旉不会(x)释放占用的锁Q如果占用了(jin)的话Q,而这一Ҏ(gu)法则相反?/p> <p>  上述的核?j)区别导致?jin)一pd的细节上的区别?/p> <p>  首先Q前面叙q的所有方法都隶属?Thread c,但是q一对却直接隶属?Object c,也就是说Q所有对象都拥有q一Ҏ(gu)法。初看v来这十分不可思议Q但是实际上却是很自然的Q因一Ҏ(gu)法阻塞时要释攑֍用的锁,而锁是Q何对象都h的,调用L对象?wait() Ҏ(gu)DU程dQƈ且该对象上的锁被释放?/p> <p>  而调?L对象的notify()Ҏ(gu)则导致因调用该对象的 wait() Ҏ(gu)而阻塞的U程中随机选择的一个解除阻塞(但要{到获得锁后才真正可执行Q?/p> <p>  其次Q前面叙q的所有方法都可在M位置调用Q但是这一Ҏ(gu)法却必须?synchronized Ҏ(gu)或块中调用,理由也很单,只有在synchronized Ҏ(gu)或块中当前线E才占有锁,才有锁可以释放?/p> <p>  同样的道理,调用q一Ҏ(gu)法的对象上的锁必Mؓ(f)当前U程所拥有Q这h有锁可以释放。因此,q一Ҏ(gu)法调用必L|在q样?synchronized Ҏ(gu)或块中,该方法或块的上锁对象是调用q一Ҏ(gu)法的对象。若不满一条gQ则E序虽然仍能~译Q但在运行时?x)出?IllegalMonitorStateException 异常?/p> <p>  wait() ?notify() Ҏ(gu)的上q特性决定了(jin)它们l常和synchronized Ҏ(gu)或块一起用,它们和操作pȝ的进E间通信机制作一个比较就?x)发现它们的怼性:(x)synchronizedҎ(gu)或块提供?jin)类g操作pȝ原语的功能,它们的执行不?x)受到多U程机制的干扎ͼ而这一Ҏ(gu)法则相当?block 和wakeup 原语Q这一Ҏ(gu)法均声明?synchronizedQ?/p> <p>  它们的结合得我们可以实现操作系l上一pd_֦的进E间通信的算法(如信号量法Q,q用于解军_U复杂的U程间通信问题。关?wait() ?notify() Ҏ(gu)最后再说明两点Q?/p> <p>  W一Q调?notify() Ҏ(gu)D解除d的线E是从因调用该对象的 wait() Ҏ(gu)而阻塞的U程中随机选取的,我们无法预料哪一个线E将?x)被选择Q所以编E时要特别小?j),避免因这U不定性而生问题?/p> <p>  W二Q除?notify()Q还有一个方?notifyAll() 也可起到cM作用Q唯一的区别在于,调用 notifyAll() Ҏ(gu)把因调用该对象?wait() Ҏ(gu)而阻塞的所有线E一ơ性全部解除阻塞。当?dng)只有获得锁的那一个线E才能进入可执行状态?/p> <p>  谈到dQ就不能不谈一谈死锁,略一分析p发现Qsuspend() Ҏ(gu)和不指定时期限?wait() Ҏ(gu)的调用都可能产生死锁。遗憄是,Java q不在语aU别上支持死锁的避免Q我们在~程中必d?j)地避免死锁?/p> <p>  以上我们?Java 中实现线E阻塞的各种Ҏ(gu)作了(jin)一番分析,我们重点分析?wait() ?notify()Ҏ(gu)Q因为它们的功能最强大Q用也最灉|Q但是这也导致了(jin)它们的效率较低,较容易出错。实际用中我们应该灉|使用各种Ҏ(gu)Q以便更好地辑ֈ我们的目的?/p> <p>  七、守护线E?/p> <p>  守护U程是一cȝD的U程Q它和普通线E的区别在于它ƈ不是应用E序的核?j)部分,当一个应用程序的所有非守护U程l止q行Ӟ即仍然有守护线E在q行Q应用程序也终止,反之Q只要有一个非守护U程在运行,应用E序׃?x)终止。守护线E一般被用于在后Cؓ(f)其它U程提供服务?/p> <p>  可以通过调用Ҏ(gu) isDaemon() 来判断一个线E是否是守护U程Q也可以调用Ҏ(gu) setDaemon() 来将一个线E设为守护线E?/p> <p>  八、线E组</p> <p>  U程l是一?Java Ҏ(gu)的概念,?Java 中,U程l是cThreadGroup 的对象,每个U程都隶属于唯一一个线E组Q这个线E组在线E创建时指定q在U程的整个生命期内都不能更改?/p> <p>  你可以通过调用包含 ThreadGroup cd参数?Thread cL造函数来指定U程属的U程l,若没有指定,则线E缺省地隶属于名?system 的系l线E组?/p> <p>  ?Java 中,除了(jin)预徏的系l线E组外,所有线E组都必L式创建。在 Java 中,除系l线E组外的每个U程l又隶属于另一个线E组Q你可以在创建线E组时指定其所隶属的线E组Q若没有指定Q则~省地隶属于pȝU程l。这P所有线E组l成?jin)一以pȝU程lؓ(f)根的?wi)?/p> <p>  Java 允许我们对一个线E组中的所有线E同时进行操作,比如我们可以通过调用U程l的相应Ҏ(gu)来设|其中所有线E的优先U,也可以启动或d其中的所有线E?/p> <p>  Java 的线E组机制的另一个重要作用是U程安全。线E组机制允许我们通过分组来区分有不同安全Ҏ(gu)的U程Q对不同l的U程q行不同的处理,q可以通过U程l的分层l构来支持不对等安全措施的采用?/p> <p>  Java ?ThreadGroup cL供了(jin)大量的方法来方便我们对线E组?wi)中的每一个线E组以及(qing)U程l中的每一个线E进行操作?/p> <p>  ?ji)、ȝ</p> <p>  在本文中Q我们讲qC(jin) Java 多线E编E的Ҏ(gu)面面Q包括创建线E,以及(qing)对多个线E进行调度、管理。我们深刻认识到?jin)多U程~程的复杂性,以及(qing)U程切换开销带来的多U程E序的低效性,q也?j)我们认真地思考一个问题:(x)我们是否需要多U程Q何旉要多U程Q?/p> <p>  多线E的核心(j)在于多个代码块ƈ发执行,本质特点在于各代码块之间的代码是乱序执行的。我们的E序是否需要多U程Q就是要看这是否也是它的内在特点?/p> <p>  假如我们的程序根本不要求多个代码块ƈ发执行,那自然不需要用多U程Q假如我们的E序虽然要求多个代码块ƈ发执行,但是却不要求乱序Q则我们完全可以用一个@环来单高效地实现Q也不需要用多U程Q只有当它完全符合多U程的特Ҏ(gu)Q多U程机制对线E间通信和线E管理的强大支持才能有用武之圎ͼq时使用多线E才是值得的?br /></p> <img src ="http://www.aygfsteel.com/endisoft/aggbug/71209.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/endisoft/" target="_blank">Endisoft</a> 2006-09-21 22:46 <a href="http://www.aygfsteel.com/endisoft/archive/2006/09/21/71209.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"></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>