易截截图软件、单文件、免安装、纯绿色、仅160KB

JAVA中的Singleton模式

单例模式,顾名思义,只能有一个实例。
一.从多线程安全说起,如下图代码,此问题可以用synchronized关键字来解决。该方法缺点:每一个线程在获取实例对象之前都要在synchronized上同步的对象上进行等待,因此效率不高。
二.Double Check方法,见下图代码。Double Check的初衷是只有当instance为NULL时执行的线程才需要在synchronized同步的对象上等待,这避免了“一”方法中的每个线程在获得实例对象之前均要在synchronized同步的对象上进行等待的弊端。但是这一设想在JAVA中却不适应。原因:JAVA内存模型并不保证一个对象的引用只有在它构造完之后才被赋予一个实例。例如:A线程执行到了instance=new SingletonClass();"instance=new SingletonClass()"这一过程的执行步骤可能是下述情形:第一步,JVM分配内存;第二部,instance指向分配的内存;第三步,调用构造方法。假设此时A线程执行到了第二步,而同时B线程开始执行,此时B线程检测到的instance不为null,但因为A线程中还未执行第三步即还没调用构造函数,所以B线程中返回的instance是不正确的。当然,这种错误时可能发生的,尽管下面代码中的执行得到的结果是正确的。
三.使用静态内部类。好处:1.可以实现延时实例化。即只有当类调用getInstance()方法时才会对instance进行实例化,而“一”“二”两种方法中都是在类第一次加载时便对instance进行了实例化。2.解决了“一”方法中,每个线程在获得实例对象之前都要在synchronized同步的对象上进行等待的缺陷。
问题:这是网络上看到的打架普遍认同的一种解决java中Singleton模式的方法,但为什么下面这种方法不存在Double Check方法中的弊端呢?即下面方法中是通过什么解决了Double Check中的问题呢?
 


相关文档:

java中List集合的使用

 在Java中如果List 结合存取的是许多类型不同的数据如int,String 类型都有,那么如何使用JSTL表达式循环获取List集合中的元素呢?
如:假如List list=new ArrayList();    int a=1; String b="sss";    String c="ddddddd";……在Servlet中 使用Session 保存
session.set ......

一些你需要知道的Java编程代码规范

首先,强烈推荐你先参考Sun官方的Java代码/编程规范:
http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html

你可以打破以上的任一规则,不过一定要有个好理由,并且记录下来。
永远,永远,永远不要在没有记录堆栈跟踪信息(stack trace)或是重新抛出异常的情况下捕获异常,俗称“吃掉异常&rd ......

Java中利用final关键字inline编译优化真的有效吗?

  为寻求java代码的性能优化,从网上搜到利用final关键字进行编译时inline优化的方法,但是真的有效吗?实际测试中发现未必,甚至性能影响巨大,最终放弃了使用final优化的想法。
  测试环境:Windows XP SP2,JDK 1.6.0_15-b03,Eclipse 3.5 SR1。
package test;
public class Test {
public static void main(St ......

JAVA(高级)工程师

一、JAVA。要想成为JAVA(高级)工程师肯定要学习JAVA。一般的程序员或许只需知道一些JAVA的语法结构就可以应付了。但要成为JAVA(高级)工程师,您要对JAVA做比较深入的研究。您应该多研究一下JDBC、IO包、Util包、Text包、JMS、EJB、RMI、线程。如果可能,希望您对JAVA的所有包都浏览一下,知道大概的API,这样您就发现其 ......

Java 内部类

定义在一个类内部的类叫内部类,包含内部类的类称为外部类。
内部类可以声明public、protected、private等访问限制,
可以声明为abstract的供其他内部类或外部类继承与扩展,
或者声明为static、final的,也可以实现特定的接口。
static的内部类行为上象一个独立的类,
非static在行为上类似类的属性或方法且禁止声明s ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号