Spring单例与多线程的理解
Spring中由容器托管的类如果没有特殊声明(scope = “prototype”),则默认为单列模式,当多用户同时请求一个服务时,容器会给每一个请求分配一个线程,这是多个线程会并发执行该请求多对应的业务逻辑(成员方法),此时就要注意了,如果该处理逻辑中有对该单列状态的修改(体现为该单列的成员属性),则必须考虑线程同步问题;否则由于在业务逻辑中执行所需的局部变量会分配在栈空间中,所以不需要同步。
当多用户同时请求一个服务时,容器会给每一个请求分配一个线程,这是多个线程会并发执行该请求多对应的业务逻辑(成员方法),此时就要注意了,如果该处理逻辑中有对该单列状态的修改(体现为该单列的成员属性),则必须考虑线程同步问题;否则由于在业务逻辑中执行所需的局部变量会分配在栈空间中,所以不需要同步。
ps:全局数据区存放静态全局变量(即单例中的类),堆区存放分配的对象,栈用来存放局部变量,因此对象的引用只有可能出现在栈和全局数据区中。
单例模式确保一个类只有一个实例,自行提供这个实例并向整个系统提供这个实例。
特点:
1,一个类只能有一个实例
2,自己创建这个实例
3,整个系统都要使用这个实例
解释:
譬如每台计算机可以有若干个打印机,但只能有一个Printer Spooler( 管理所有本地和网络打印队列及控制所有打印工作), 以避免两个打印作业同时输出到打印机中。
例子:
第一种形式: 也是常用的形式。
public class Singleton {
private static Singleton instance = null;
private Singleton()
{ //do something }
//这个方法比下面的有所改进,不用每次都进行生成对象,只是第一次使用时生成实例,提高了效率
public static Singleton getInstance(){
if(instance==null){
instance = new Singleton();
}
return instance;
}
}
第二种形式:
public class Singleton {
//在自己内部定义自己的一个实例,只供内部调用
private static Singleton instance = new Singleton();
private Singleton()
//do something }
//这里提供了一个供外部访问本class的静态方法,可以直接访问
public static Singleton getInstance()
{
return instance;
}
}
=======singleton bean和singleton模式区别=============================
spring
项目加载的时候bean(一个bean对应某个类)自动创建(初始化,建一个实例),而后是每次调用bean的时候是注入的(不是重新new。。所有整个系统都是这个实例,,而且是spring自动提供的)
一:对于Spring中实现Singleton模式,是以IOC容器为单位(就是说在这个容器里面bean实现Singleton),换句话说,一个JVM可能有多个IOC容器,而在这个容器里实现了singleton bean,
而Java中实现Singleton模式而言,只有一个JVM,jvm中某个class只有一个实例
二:
singleton模式中,singleton的class在整个JVM中只有一个instance,
Spring的Bean,你可以一个class配置多个Bean,这个class就有了多个instance。
这个singleton是指在spring容器中,这个Bean是单实例的,是线程共享的。所以要求这些类都是线程安全的。也就是说,不能出现修改Bean属性的方法,当然除了设值得那些setter。只要满足线程安全,这些bean都可以用singleton。而且我们在绝大多数使用上,也是这样用的,包括dao,service。
Beanfactory是Spring初始以静态方式载入的,Spring的单例IOC是基于容器级的,所以这你都不用担心与考虑.
更多推荐
所有评论(0)