易截截图软件、单文件、免安装、纯绿色、仅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笔试题选择题

1下面哪个是正确的类声明?假设每一段文本都做为一个名称为Fred.java的文件的全部内容? a
a).
public class Fred{
public int x = 0;
public Fred (int x){
      this.x=x;
}
}
b).
public class fred{
public int x = 0;
public Fred (int x){
this.x=x;
}
}
c).
public class ......

利用JFreeChart生成简单柱状图(Java)

package barchartdemo1;
import java.awt.Font;
import java.io.FileOutputStream;
import java.io.IOException;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.Numbe ......

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 Socket编程基础

 最简单的服务器接受单用户请求的socket编程模型,代码写得不好,只是用来阐明意思
 client side
import java.net.*;
import java.util.*;
import java.io.*;
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
tr ......

Java集合类List/Set/Map的区别和联系

 
一、Array , Arrays
Java所有“存储及随机访问一连串对象”的做法,array是最有效率的一种。
1、
效率高,但容量固定且无法动态改变。
array还有一个缺点是,无法判断其中实际存有多少元素,length只是告诉我们array的容量。
2、Java中有一个Arrays类,专门用来操作array。
   
a ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号