将单例的bean创建多个、单例模式(两种模式)
将单例的bean创建多个
在spring容器中每个bean都是唯⼀的
怎么将单例的bean创建多个
两种实现⽅式
1 在类上加⼀个注解
@Scope("prototype")
2 在xml配置
<bean id=" " class="" scope="prototype"></bean>
request:针对web项⽬,不同的请求创建单独的bean对象,同⼀个请求共享⼀个bean
session:针对web项⽬,不同的会话创建单独的bean对象,同⼀个会话共享⼀个bean
在Java体系中没有特殊要求默认都是单例的
单例模式:懒汉式;⽤的时候才创建
1 创建⼀个本⾝类的属性instance
2 创建⼀个该类的构造⽅法SingletonDemo,将该构造⽅法⽤private修饰,⽬的就是让其他类new不出
3 创建⼀个返回该类型的静态⽅法
4 在⽅法中先判断属性类instance是不是null,如果是null就给该属性赋值,赋的就是new该类(创建⼀个实例)
5 如果该属性类instance有值就返回该属性类
public class SingletonDemo {
private static SingletonDemo instance;
private SingletonDemo(){}
public static SingletonDemo getInstance(){
if(instance==null){
instance = new SingletonDemo();
}
return instance;
}
}
以上是⾮线程安全的单例(⾼并发的情况下同时有多个线程判断到的都是instance==null,这个时候这⼏个线程就会创建相同的实例,这样就违背了单例模式的初衷)
线程相对安全的单例
⽅式⼀:在创建实例赋值的⽅法上加⼀个关键字synchronized(加在⽅法的访问权限后)
该关键字的意思是在同⼀时间只会被同⼀线程访问
单例模式的几种实现方式public class SingletonDemo {
private static SingletonDemo instance;
private SingletonDemo(){}
public synchronized static SingletonDemo getInstance(){
if(instance==null){
instance = new SingletonDemo();
}
return instance;
}
}
⽅式⼆: synchronized (SingletonDemo.class)的意思就是
当发现instance==null的时候同步整个代码块,将 instance = new SingletonDemo()放在整个执⾏安全的过程中
public class SingletonDemo {
private volatile static SingletonDemo instance;
private SingletonDemo(){}
public static SingletonDemo getInstance(){
if(instance==null){
synchronized (SingletonDemo.class){
if(instance==null){
instance = new SingletonDemo();
}
}
}
return instance;
}
}
以上写法还是会创建多个对象,这个原因跟写法没有关系,是因为,java代码执⾏⾼并发时(为了运算速度快)会将主线程复制为⼀个副本,虽然instance属性是定义在主线程中的,但是执⾏时被拆分的副本也会同时执⾏,这样就会取到jvm优化、计算过程中的值,这是jvm 对线程进⾏优化的部分,做⼀个缓存机制,这样还是会有问题;解决该⽅法⽐较简单,就是在属性类instance上加⼀个关键字volatile,意思就是每次取该属性值时都是在源头上取值,不是从副本⾥取值
线程安全的单例
public class SingletonDemo {
private volatile static SingletonDemo instance;
private SingletonDemo(){}
public static SingletonDemo getInstance(){
if(instance==null){
synchronized (SingletonDemo.class){
if(instance==null){
instance = new SingletonDemo();
}
}
}
return instance;
}
}
单例模式:饿汉式;程序启动加载资源时就创建好
public Simple(){
private static Single s=new Single();
private Single(){}
public static Simple getSimple(){
return s;
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论