2 github 30159827 github_30159827 于 2015.07.27 18:43 提问

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

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两条线程同时访问, 不就会出现异常了么? 因为不是独占的?


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

7个回答

qq_26399249
qq_26399249   2015.07.27 19:57

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

sina_2831808769
sina_2831808769   Rxr 2015.07.27 20:52

方法使用synchronized声明

danielinbiti
danielinbiti   Ds   Rxr 2015.07.27 21:48

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

Evankaka
Evankaka   Ds   Rxr 2015.07.27 21:54

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

cuiwei1026522829
cuiwei1026522829   Ds   Rxr 2015.07.27 22:04
miracle_yao
miracle_yao   2015.07.27 22:27
CSDNXIAON
CSDNXIAON   2015.07.27 18:54

类单例的实现。(一个单例的线程安全日志类)
----------------------同志你好,我是CSDN问答机器人小N,奉组织之命为你提供参考答案,编程尚未成功,同志仍需努力!

z88897050
z88897050 呵呵,真是醉了
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片