java单例的几种实现方法:

方式1:

public class Something {
    private Something() {}

    private static class LazyHolder {
        private static final Something INSTANCE = new Something();
    }

    public static Something getInstance() {
        return LazyHolder.INSTANCE;
    }
}

方式2:

public class Singleton {
    private static final Singleton INSTANCE = new Singleton();

    private Singleton() {}

    public static Singleton getInstance() {
        return INSTANCE;
    }
}

方式3:

public class Singleton {
    private static final Singleton instance;

    static {
        try {
            instance = new Singleton();
        } catch (Exception e) {
            throw new RuntimeException("Darn, an error occurred!", e);
        }
    }

    public static Singleton getInstance() {
        return instance;
    }

    private Singleton() {
        // ...
    }
}

方式4:

public enum Singleton {
    INSTANCE;
    public void execute (String arg) {
        // Perform operation here
    }
}

方式5:

public class SingletonDemo {
    private static volatile SingletonDemo instance;
    private SingletonDemo() { }

    public static SingletonDemo getInstance() {
        if (instance == null ) {
            synchronized (SingletonDemo.class) {
                if (instance == null) {
                    instance = new SingletonDemo();
                }
            }
        }

        return instance;
    }
}

方式6:

使用apache commons lang: LazyInitializer

 public class ComplexObjectInitializer extends LazyInitializer<ComplexObject> {
     @Override
     protected ComplexObject initialize() {
         return new ComplexObject();
     }
 }

 // Create an instance of the lazy initializer
 ComplexObjectInitializer initializer = new ComplexObjectInitializer();
 ...
 // When the object is actually needed:
 ComplexObject cobj = initializer.get();

方式7:

使用guava:

 private static final Supplier<String> tokenSup = Suppliers.memoize(new Supplier<String>() {
        @Override
        public String get() {
            //do some init
            String result = xxx;
            return result;
        }
    });
时间: 2024-09-16 09:51:29

java单例的几种实现方法:的相关文章

Java数据库连接池的几种配置方法(以MySQL数据库为例)_java

一.Tomcat配置数据源: 前提:需要将连接MySQL数据库驱动jar包放进Tomcat安装目录中common文件夹下的lib目录中 1.方法一:在WebRoot下面建文件夹META-INF,里面建一个文件context.xml,如下: <?xml version="1.0" encoding="UTF-8"?> <Context> <Resource name="jdbc/chaoshi" auth="

Java线程池的几种实现方法和区别介绍_java

Java线程池的几种实现方法和区别介绍 import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Random; import java.util.concurrent.Callable; import java.util.concurrent.E

java单例问题?

问题描述 N个客户机掉一个单例会不回使系统性能下降.java单例是多线程.我还是有点不明白这个, 解决方案 有同步,就会慢下来.没有,就不会,而且有可能会被HotSpot优化后,跑的更快.解决方案二:首先N个客户机掉一个单例并不意味着他们调用的是同一个对象,而单例更多的是每个客户机进入以后先实例化一个对象,然后存在于这个客户机访问的这个生命周期.你多线程访问同一个对象很不安全,如果其中有一个释放他的内存空间,那么所有的都得重新再去获得,这在应用中显然是不可能的!这是自己的见解,希望牛人提点!解决

用java实现云计算的两种趋势性方法

本文讲的是用java实现云计算的两种趋势性方法,[IT168 资讯]最近,人们在思考如何使用Java来实现云计算,我看到了两种趋势性的方法.它们存在交叉重叠处而并非互相排斥,但总体而言它们在项目方面有着非常不同的表现: 重面向UI(Heavy UI oriented) 这种类型的应用或框架通常提供基于UI的控制台.管理应用.插件等,这为管理云中的资源比如开始和停止图像等提供了唯一的方法.这种方法的关键特征是它需要大量用户的输入和人的干预,所以这变得相对不动态.不随需而变.最好的例子是:Right

Java线程池的几种实现方法及常见问题解答_java

工作中,经常会涉及到线程.比如有些任务,经常会交与线程去异步执行.抑或服务端程序为每个请求单独建立一个线程处理任务.线程之外的,比如我们用的数据库连接.这些创建销毁或者打开关闭的操作,非常影响系统性能.所以,"池"的用处就凸显出来了. 1. 为什么要使用线程池 在3.6.1节介绍的实现方式中,对每个客户都分配一个新的工作线程.当工作线程与客户通信结束,这个线程就被销毁.这种实现方式有以下不足之处: •服务器创建和销毁工作的开销( 包括所花费的时间和系统资源 )很大.这一项不用解释,可以

关于Java单例对象同步问题

单例对象(Singleton)是一种常用的设计模式.在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在.正是由于这个特点,单例对象通常作为程序中的存放配置信息的载体,因为它能保证其他对象读到一致的信息.例如在某个服务器程序中,该服务器的配置信息可能存放在数据库或文件中,这些配置数据由某个单例对象统一读取,服务进程中的其他对象如果要获取这些配置信息,只需访问该单例对象即可.这种方式极大地简化了在复杂环境下,尤其是多线程环境下的配置管理,但是随着应用场景的不同,也可能带来一些同步

Java单例进化史

关于单例,从我学Java到现在只知道以下两点: 1.为了让一个类只能有一个实例,所以使用单例的设计模式. 2.有两种实现方法:①饿汉式 ②懒汉式 ①饿汉式简单,是线程安全的.但是在类加载时就创建了一个实例,但是这个单例类可能永远不会被使用,这就造成了浪费.而且类被加载器加载时就会实例化一次.这就有可能被实例化多次. public class Singleton { private static final Singleton INSTANCE = new Singleton(); private

Java对象排序的3种实现方法

/** * Java对象排序的3种实现方式 * @author zhangwenzhang * */public class TestObjectSort { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub /**方法1 * 使用Collections.sort(List, Comparator)实现,必须实现Comparator的一个比较器并复写co

php 防止表单重复提交两种实现方法_php实例

php 防止表单重复提交 由于网络原因,经常出来点了提交按钮,网页没有反应,而进行再次点击.这样就导致后台收到两次提交,从而进行两次处理,本文章向大家介绍php 防止表单重复提交的几种方法 1.前端解决 方法一: 可以通过前端来解决.当用户点了提交按钮之后,先使用js进行有效性判断,没问题后,将提交按钮"禁用"掉.然后再提交! 方法二: 使用ajax提交表单.点了提交按钮后,禁用提将按钮,或者设置一个状态值,将其设为1,表示正在提交.再提交时判断如果正在提交,则不作处理.等ajax返回