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中的问题呢?
相关文档:
JNI是Java Native Interface的缩写,通过使用native方法,Java可以调用本地C/C++子程序。声明一个本地子程序的方法是:在方法名前添加native修饰,如
public native void myfun();
调用该子程序的方法为:
static{
System.loadLibrary("myfun");
}
在Windows上,上面的myfun即指包含用C/C++写的my ......
第一:
1.String是最基本的数据类型么?
答:不是。基本的数据类型包括:byte,int,char,long,float,double,boolean和short.
java.lang.String类是final类型的,因此不可以继承这个类,不能修改这个类。
2.静态变量和实例变量的区别?
答:static i = 10 ;//常量
&nb ......
在Java中如果List 结合存取的是许多类型不同的数据如int,String 类型都有,那么如何使用JSTL表达式循环获取List集合中的元素呢?
如:假如List list=new ArrayList(); int a=1; String b="sss"; String c="ddddddd";……在Servlet中 使用Session 保存
session.set ......
定义在一个类内部的类叫内部类,包含内部类的类称为外部类。
内部类可以声明public、protected、private等访问限制,
可以声明为abstract的供其他内部类或外部类继承与扩展,
或者声明为static、final的,也可以实现特定的接口。
static的内部类行为上象一个独立的类,
非static在行为上类似类的属性或方法且禁止声明s ......
import java.io.*;
public class TestExe {
public static void main(String[] args) throws InterruptedException {
try {
Process child = Runtime.getRuntime().exec("C://Program Files//Sunyard//ImageInput//ImageInput.exe");
child.waitFor();
&n ......