爱飞 发表于 2015-1-18 11:53:59

JAVA网站制作之Java中ThreadLocal的计划与利用

令人可喜的是java现在已经开源了,所以我想我上述的想法也许有一天会实现,因为java一直都是不断创新的语言,每次创新都会给我们惊喜,这也是我喜欢java的一个原因。计划早在Java1.2推出之时,Java平台中就引进了一个新的撑持:java.lang.ThreadLocal,给我们在编写多线程程序时供应了一种新的选择。利用这个工具类能够很简便地编写出幽美的多线程程序,固然ThreadLocal十分有效,可是仿佛如今懂得它、利用它的伴侣还未几。

  ThreadLocal是甚么

  ThreadLocal是甚么呢?实在ThreadLocal并不是是一个线程的当地完成版本,它并非一个Thread,而是threadlocalvariable(线程部分变量)。大概把它定名为ThreadLocalVar加倍符合。线程部分变量(ThreadLocal)实在的服从十分复杂,就是为每个利用该变量的线程都供应一个变量值的正本,是每个线程都能够自力地改动本人的正本,而不会和别的线程的正本抵触。从线程的角度看,就仿佛每个线程都完整具有该变量。线程部分变量并非Java的新创造,在别的的一些言语编译器完成(如IBMXLFORTRAN)中,它在言语的条理供应了间接的撑持。由于Java中没有供应在言语条理的间接撑持,而是供应了一个ThreadLocal的类来供应撑持,以是,在Java中编写线程部分变量的代码绝对对照愚笨,这大概是线程部分变量没有在Java中失掉很好的提高的一个缘故原由吧。

  ThreadLocal的计划

  起首看看ThreadLocal的接口:

   Objectget();//前往以后线程的线程部分变量正本protectedObjectinitialValue();//前往该线程部分变量确当前列程的初始值
   voidset(Objectvalue);//设置以后线程的线程部分变量正本的值

  ThreadLocal有3个办法,个中值得注重的是initialValue(),该办法是一个protected的办法,明显是为了子类重写而特地完成的。该办法前往以后线程在该线程部分变量的初始值,这个办法是一个提早挪用办法,在一个线程第1次挪用get()大概set(Object)时才实行,而且仅实行1次。ThreadLocal中切实其实实完成间接前往一个null:

protectedObjectinitialValue(){returnnull;}
  ThreadLocal是怎样做到为每个线程保护变量的正本的呢?实在完成的思绪很复杂,在ThreadLocal类中有一个Map,用于存储每个线程的变量的正本。好比上面的示例完成:

publicclassThreadLocal
{
 privateMapvalues=Collections.synchronizedMap(newHashMap());
 publicObjectget()
 {
  ThreadcurThread=Thread.currentThread();
  Objecto=values.get(curThread);
  if(o==null&&!values.containsKey(curThread))
  {
   o=initialValue();
   values.put(curThread,o);
  }
  returno;
 }

 publicvoidset(ObjectnewValue)
 {
  values.put(Thread.currentThread(),newValue);
 }

 publicObjectinitialValue()
 {
  returnnull;
 }
}
  固然,这并非一个产业强度的完成,但JDK中的ThreadLocal的完成整体思绪也相似于此。

  ThreadLocal的利用

  假如但愿线程部分变量初始化别的值,那末必要本人完成ThreadLocal的子类偏重写该办法,一般利用一个外部匿名类对ThreadLocal举行子类化,好比上面的例子,SerialNum类为每个类分派一个序号:

publicclassSerialNum
{
 //Thenextserialnumbertobeassigned

 privatestaticintnextSerialNum=0;
 privatestaticThreadLocalserialNum=newThreadLocal()
 {
  protectedsynchronizedObjectinitialValue()
  {
   returnnewInteger(nextSerialNum++);
  }
 };

 publicstaticintget()
 {
  return((Integer)(serialNum.get())).intValue();
 }
}
  SerialNum类的利用将十分地复杂,由于get()办法是static的,以是在必要猎取以后线程的序号时,复杂地挪用:

intserial=SerialNum.get();
  便可。

  在线程是举动的而且ThreadLocal对象是可会见的时,该线程就持有一个到该线程部分变量正本的隐含援用,当该线程运转停止后,该线程具有的以是线程部分变量的正本都将生效,并守候渣滓搜集器搜集。

  ThreadLocal与别的同步机制的对照

  ThreadLocal和别的同步机制比拟有甚么上风呢?ThreadLocal和别的一切的同步机制都是为懂得决多线程中的对统一变量的会见抵触,在一般的同步机制中,是经由过程对象加锁来完成多个线程对统一变量的平安会见的。这时候该变量是多个线程共享的,利用这类同步机制必要很仔细地剖析在甚么时分对变量举行读写,甚么时分必要锁定某个对象,甚么时分开释该对象的锁等等良多。一切这些都是由于多个线程共享了资本酿成的。ThreadLocal就从另外一个角度来办理多线程的并发会见,ThreadLocal会为每个线程保护一个和该线程绑定的变量的正本,从而断绝了多个线程的数据,每个线程都具有本人的变量正本,从而也就没有需要对该变量举行同步了。ThreadLocal供应了线程平安的共享对象,在编写多线程代码时,能够把不平安的全部变量封装进ThreadLocal,大概把该对象的特定于线程的形态封装进ThreadLocal。

  因为ThreadLocal中能够持有任何范例的对象,以是利用ThreadLocalget以后线程的值是必要举行强迫范例转换。但跟着新的Java版本(1.5)将模版的引进,新的撑持模版参数的ThreadLocal<T>类将从中受害。也能够削减强迫范例转换,并将一些毛病反省提早到了编译期,将必定水平地简化ThreadLocal的利用。

  总结

  固然ThreadLocal其实不能替换同步机制,二者面向的成绩范畴分歧。同步机制是为了同步多个线程对不异资本的并发会见,是为了多个线程之间举行通讯的无效体例;而ThreadLocal是断绝多个线程的数据共享,从基本上就不在多个线程之间共享资本(变量),如许固然不必要对多个线程举行同步了。以是,假如你必要举行多个线程之间举行通讯,则利用同步机制;假如必要断绝多个线程之间的共享抵触,可使用ThreadLocal,这将极年夜地简化你的程序,使程序加倍易读、简便。

再说第三点:我并没有提到服务器也要整合,然后是IDE,一个好的IDE能够200%提高开发的速度,就说图形方面:你是经过简单托拽和点击就能实现功能好那。

admin 发表于 2015-1-20 09:35:42

任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言

小妖女 发表于 2015-1-25 17:40:50

你快去找一份Java的编程工作来做吧(如果是在校学生可以去做兼职啊),在实践中提高自己,那才是最快的。不过你得祈祷在公司里碰到一个高手,而且他 还愿意不厌其烦地教你,这样好象有点难哦!还有一个办法就是读开放源码的程序了。我们知道开放源码大都出自高手,他们设计合理,考虑周到,再加上有广大的程序员参与,代码的价值自然是字字珠叽,铿锵有力(对不起,偶最近《金装四大才子》看多了)。

仓酷云 发表于 2015-1-30 18:31:17

你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢?

谁可相欹 发表于 2015-2-2 22:08:20

多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。

深爱那片海 发表于 2015-2-8 10:45:41

你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。

再现理想 发表于 2015-2-25 09:12:44

J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。

海妖 发表于 2015-3-6 00:31:11

Java 编程语言的风格十分接近C、C++语言。

愤怒的大鸟 发表于 2015-3-10 20:45:27

Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。

不帅 发表于 2015-3-11 18:19:31

Java是一种计算机编程语言,拥有跨平台、面向对java

兰色精灵 发表于 2015-3-14 15:38:39

在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。

小魔女 发表于 2015-3-17 16:08:10

你快去找一份Java的编程工作来做吧(如果是在校学生可以去做兼职啊),在实践中提高自己,那才是最快的。不过你得祈祷在公司里碰到一个高手,而且他 还愿意不厌其烦地教你,这样好象有点难哦!还有一个办法就是读开放源码的程序了。我们知道开放源码大都出自高手,他们设计合理,考虑周到,再加上有广大的程序员参与,代码的价值自然是字字珠叽,铿锵有力(对不起,偶最近《金装四大才子》看多了)。

简单生活 发表于 2015-3-24 10:34:35

Java 编程语言的风格十分接近C、C++语言。

只想知道 发表于 2015-3-26 03:37:55

当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢?

分手快乐 发表于 2015-3-28 22:53:25

Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站

柔情似水 发表于 2015-4-1 17:07:46

Java是一种计算机编程语言,拥有跨平台、面向对java

再见西城 发表于 2015-4-3 21:28:43

Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。

山那边是海 发表于 2015-4-16 23:50:46

让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。

飘飘悠悠 发表于 2015-4-27 15:06:57

象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。

第二个灵魂 发表于 2015-5-6 17:11:06

如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。
页: [1]
查看完整版本: JAVA网站制作之Java中ThreadLocal的计划与利用