via: http://blog.csdn.net/natee/article/details/4408245
Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。
第一种形式
public class Singleton {
// Early initialization.定义的时候就初始化(不推荐)。
private static Singleton s = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return s;
}
}
第二种形式
public class Singleton {
private static Singleton s;
private Singleton() {
}
// Lazy initialization. 延迟初始化,使用的时候再初始化,效率较高(推荐)。
public static Singleton getInstance() {
if (s == null) {
s = new Singleton();
}
return s;
}
}
实现的关键:
1. 将所有的构造函数都设为private ,而且必须显示的指定构造函数(不能设置为默认的,因为默认构造函数是package访问权限)。
2. 注意clone()方法。
例如, 如果基类实现了cloneable接口的话,子类就应该重写该方法。当然,在应用中应该灵活运用各种方法来防止clone()的各种情况。
@Override
protected Object clone() throws CloneNotSupportedException {
throw new CloneNotSupportedException();
}
多线程调用singleton方法:
如果在网络编程中,要注意多线程访问singleton引发的一系列问题:
public class Singleton {
private static Singleton s;
private Singleton() {
}
// 如果多个线程同时访问, 有可能会出现多个实例。
public static Singleton getInstance() {
// 第一次初始化时,多个线程同时执行"if (s == null)",判断结果都为真,所以都会执行下面的操作:"s = new Singleton()",由此引发多个实例的出现。
if (s == null) {
s = new Singleton();
}
return s;
}
}
解决方法1(不推荐):
public class Singleton {
private static Singleton s;
private Singleton() {
}
// 将该方法加上synchronized关键字。这种方法确实能解决问题,但效率不是很高。因为每次调用该方法的时候,都需要阻塞该方法,但事实上只有第一次初始化的时候才会出现这种情况,所以......
public static synchronized Singleton getInstance() {
if (s == null) {
s = new Singleton();
}
return s;
}
}
解决方法2(推荐):
public class Singleton {
private static Singleton singleton;
private Singleton() {
}
public static Singleton getInstance() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
相关推荐
但这种方式在多线程环境下会出现问题,可能导致多个实例。 ```java public class Singleton { private static Singleton instance; private Singleton() {} public static Singleton getInstance() { if ...
`volatile`关键字确保了多线程环境下的可见性和有序性,避免了指令重排序的问题。 4. 静态内部类(Static Inner Class Singleton): 类的加载是线程安全的,因此这种方式也是线程安全的,且延迟初始化。如下所示...
7. **并发模型**:理解Java内存模型(JMM)和并发编程模型,如MESI协议,有助于编写出高效且正确的多线程代码。 8. **事务管理**:ATM操作通常涉及数据库交互,因此需要事务支持以保证原子性、一致性、隔离性和持久...
1. **多线程增强**:Java 1.7引入了Fork/Join框架,它是一个并行计算模型,通过将大任务分解为小任务来加速执行。`java.util.concurrent.ForkJoinPool`和`java.util.concurrent.RecursiveTask`是其核心类。 2. **...
在Java中创建线程安全的Singleton模式是一项重要的任务,尤其是在多线程环境中。通过使用饿汉式、懒汉式与双重检查锁定、静态内部类或枚举等方式,可以确保Singleton实例的唯一性和线程安全。每种方式都有其适用场景...
并且由于实例在类加载时就创建,所以不存在多线程下的性能问题。 缺点:Singleton实例在类加载时就被创建,即使可能永远都不会用到,造成了内存浪费。 ### 2. 懒汉式(Synchronized Method) 这种方式是在`...
1. **非线程安全**:这个版本在多线程环境下存在安全隐患,多个线程可能会同时进入`if`语句块创建多个实例。 2. **懒加载**:实现了懒加载机制,但没有解决线程安全问题。 3. **简单性**:相对于双重检查锁定,该...
但是这种方式在多线程环境下是不安全的,可能导致多个实例。 ```java public class Singleton { private static Singleton instance; private Singleton() {} public static Singleton getInstance() { if ...
在Java编程领域,电梯模拟系统是一个经典的多线程问题,用于演示并发控制和调度策略。这个"java_elevator.rar"项目就是一个很好的实例,它通过Java语言实现了一个包含5台电梯和20层楼的电梯调度系统。下面我们将深入...
在Java编程中,Core Java是指Java的基础部分,包括类、对象、接口、异常处理、集合框架、多线程、输入输出、网络编程等核心概念和技术。在这个项目中,我们可以看到以下关键知识点: 1. **面向对象编程**:Java是一...
综上所述,Java酒店管理系统涵盖了Java编程、数据库操作、GUI设计、多线程、异常处理等多个核心知识点,是学习和实践Java技术的绝佳案例。通过深入理解和分析这个项目,开发者能够提升在企业级应用开发方面的能力。
标题中的“多线程下的Singleton”指的是在编程中如何在多线程环境下正确实现单例模式。单例模式是一种设计模式,确保一个类只有一个实例,并提供一个全局访问点。在多线程环境中,如果不妥善处理,可能会导致多个...
Java Socket和ServerSocket是Java网络编程中的...总的来说,这个基于Java Socket/ServerSocket的多线程聊天室系统充分展示了Java网络编程的核心技术和设计原则,是学习和实践网络通信、并发处理和对象传输的优秀案例。
2. 数据库连接管理:在多线程环境下,共享数据库连接池以提高性能和减少资源消耗。 3. 资源共享:如网络请求、图片加载等,通过单例可以避免重复加载和内存浪费。 接下来,我们将通过一个简单的SingletonTest示例来...
这种实现方式在第一次调用`getInstance()`时才创建实例,但在多线程环境下不安全。 3. 懒汉式(线程安全 - 同步方法) ```java public class Singleton { private static Singleton instance; private ...
Singleton模式在Java多线程环境中的实现需要注意线程安全问题。传统的懒汉式实现可能会导致多个实例,而使用同步方法虽然解决了安全性问题,但效率较低。双检锁(DCL)在Java 5及以上版本中提供了较好的平衡,既保证...
### Java多线程编程环境中单例模式的实现 #### 概述 单例模式是一种常用的软件设计模式,它确保一个类只有一个实例,并提供一个全局访问点。在Java中,单例模式的应用非常广泛,特别是在资源管理、日志记录、...
总之,"jiao_java_"项目结合了Java的后端编程能力与杀毒软件或用户账号系统的功能需求,涉及了多方面的编程技术和概念。通过研究这个项目,开发者不仅可以提升Java编程技巧,还能学习如何构建安全、高效的系统。
为了保证数据的一致性,在多线程环境中需要对共享资源进行同步访问。Java提供了多种机制来实现线程间的同步,包括`synchronized`关键字、显式锁(`ReentrantLock`)、`volatile`关键字等。 #### synchronized关键字 ...
8. **多线程**:在高级模拟中,可能会考虑多线程来模拟多个用户同时使用ATM的情况,确保并发安全。 9. **设计模式**:根据系统复杂性,开发者可能需要运用单例模式(Singleton)来保证ATM实例的唯一性,工厂模式...