spring-一个关于单例和线程的问题

问题描述

一个关于单例和线程的问题
Spring的bean 默认是单例的
也就是说每次请求获取的bean都是同一个 验证hashCode也确实是相等的.

 @Autowired    private TestBean testBean;    @RequestMapping(""test1.html"")    public @ResponseBody String test1() throws InterruptedException {        testBean.test();        return ""123"";    }
public class TestBean {    public void test() throws InterruptedException {        System.out.println(""begin sleep..............................."");        System.out.println(this.hashCode());        Thread.sleep(5000);        System.out.println(""end sleep..............................."");    }}

进行一个简单的验证. 用浏览器打开两个标签前后访问.

begin sleep...............................
1445493050
end sleep...............................
begin sleep...............................
1445493050
end sleep...............................

结果是这样的 后访问的会等待第一个请求执行完成 睡眠结束才进入.
但是如果就开一个标签 一个劲儿的点刷新 结果又成了这样.

begin sleep...............................
1445493050
begin sleep...............................
1445493050
begin sleep...............................
1445493050
begin sleep...............................
1445493050
end sleep...............................
end sleep...............................
end sleep...............................
end sleep...............................

一直点刷新 之后的请求居然没有等到之前的请求睡眠结束 就进入了.
这是何解? 为啥两种方式测试结果不同?
且第二种结果给人的感觉是同一个对象可以被多个线程同时使用?
如果是可以 那单例就并不是线程安全的了?
单例对象里的值如果在访问过程中会发生改变 在访问结束后会还原.
那么A/B两条线程同时访问 不就会出现异常了么? 因为不是独占的?


测试有误 分两个浏览器来访问的时候 就是和连续刷新效果一样了.
也就是说确认多线程可以同时访问同一个对象了.

解决方案

表示不懂,醉了醉了,好难得感觉

解决方案二:
方法使用synchronized声明

解决方案三:
那单例本来就不是线程安全的,应该也没地方说过单例是线程安全的。因此要避免在controller中定义成员变量。

解决方案四:
单例如果没加同步,就不是线程安全的啊,你又没上锁,当然每个线程都可以同时访问和修改

解决方案五:
http://www.cnblogs.com/doit8791/p/4093808.html

http://blog.sina.com.cn/s/blog_6151984a0100kfi5.html

解决方案六:
http://blog.sina.com.cn/s/blog_6151984a0100kfi5.html

解决方案七:
类单例的实现。(一个单例的线程安全日志类)

时间: 2025-01-21 00:52:45

spring-一个关于单例和线程的问题的相关文章

spring-请教Spring如何清楚单例bean的缓存

问题描述 请教Spring如何清楚单例bean的缓存 我有两个WEB工程使用了同一个名字的bean,在运行第二个工程的时候报错,错误是在第一个工程里的同名bean的函数里,控制台里有下面这句话 :- Returning cached instance of singleton bean 'itemController' 请问这个缓存怎么才能删除!! 我在把tomcat下的work目录里的localhost删掉又重启了服务器,但是这个缓存还是存在,请高手指点以下吧,谢谢了!! 解决方案 Sprin

请求-spring mvc service单例问题

问题描述 spring mvc service单例问题 spring mvc 的项目,controller的注解@Scope("session"),是会话级别的.对于每一个用户请求都会产生实例,这没有问题.那我controller中通过@Autowired注入的service,它现在也是会话级别的?还是仍然是单例的?即:每个用户的请求都会产生一个controller实例,那service的实例是产生一个还是多个呢?谢谢. 解决方案 service的实例在项目启动进行初始的时候已经生成了

实例-一个方法里需要多次使用一个用单例创建的类 需要多次使用单例方法创建吗?

问题描述 一个方法里需要多次使用一个用单例创建的类 需要多次使用单例方法创建吗? 通过单例创建一个实例,下次调用实例 和 每次都通过单例方法创建有什么不同? 解决方案 既然是单例,每次调用都使用第一次创建的对象,不会每次都创建. 也许你想说单例和静态方法的区别.单例的对象可以继承,但是静态方法不行. 解决方案二: 一个方法里需要使用单例创建一个实例变量,这个实例变量需要多次使用. 每次使用多用时都用单例创建和第一次使用单例创建一个实例变量,以后直接调用实例变量.这两种方法有什么不同?那个更好 解

spring管理的单例对象内部如果有字段类型那么是否有线程安全问题

问题描述 service层,dao层默认都是单例的.而且我看到资料上说,这种单例实际上是用threadlocal实现的,而这种技术是一个线程复制了一个特殊的副本来实现单例模式,用完再回收,那么是不是可以说,如果service层和dao层有定义一些字段,这些字段会在使用的时候产生多线程安全问题? 解决方案 {这种单例实际上是用threadlocal实现的,而这种技术是一个线程复制了一个特殊的副本来实现单例模式,用完再回收} 你这个地方的描述就是错的.在Spring容器当中管理的对象默认都是单例模式

spring 单例多例,默认,懒加载,初始化调用

(1)spring 默认是单例, 单例情况下:所有线程对于同一个类共同拥有一个对象,此时如果在类里面创建一个类变量如下 由于所有线程共享一个类对象,所以也共享一个类变量,每次请求都会增加 @Controller @RequestMapping("/user") public class User { private int i=0;//类变量 @RequestMapping("/list.shtm") public String list() { i++; Syst

【java设计模式】之 单例(Singleton)模式

1. 单例模式的定义         单例模式(Singleton Pattern)是一个比较简单的模式,其原始定义如下:Ensure a class has only one instance, and provide a global point of access to it. 即确保只有一个实例,而且自行实例化并向整个系统提供这个实例.单例模式的通用类如下图所示:         Singleton类称为单例类,通过使用private的构造函数确保了在一个应用中只产生一个实例,并且是自行

oc-spring管理的单例bean能否在service中手动new实例化?

问题描述 spring管理的单例bean能否在service中手动new实例化? 以下配置的ModuleTest这个类能否在其他service方法中直接手动new实例化? <bean id="moduleTest" class="com.hh.ProTest.ModuleTest"></bean> service的配置如下: <bean id="serviceTest" class="com.hh.Serv

关于将socket对象作为单例类的成员变量

问题描述 业务场景:1.系统在初始化时创建Socket对象(客户端)2.将创建的Socket对象作为系统全局变量,共其他方法使用.我的实现思路方法大致如下://系统初始化类publicclassInitialize{publicvoidinit(){Socketsocket=newSocket(ipAddress,port);//创建socket连接SocketSingleIntancessi=SocketSingleIntance.getSingleIntance();//将socket交由单

C++实现一个线程安全的单例工厂

我们见到经常有人用 static 局部对象的方式实现了类似单例模式,最近发现一篇文章明确写明 编译器在处理  static局部变量的时候 并不是线程安全的 !!! http://blogs.msdn.com/b/oldnewthing/archive/2004/03/08/85901.aspx     于是实现了一个单例工厂  并且是线程安全的 #ifndef SINGLETONFACTORY_H #define SINGLETONFACTORY_H #include "windows.h&qu