关于多线程请求下的springmvc的controller单例的问题

1.springmvc模式下装载的实体都是单例模式。那单例中变量共享,测试共享变量在多个线程请求下回共享。但是类中函数方法却没有阻塞?各路神仙解释下原因呗?

阅读 5.7k
4 个回答

引用我之前的回答---------
我个人认为是你把单例和线程安全搞混了,单例并不意味着线程安全,多线程同时访问单例同样存在并发问题,除非你手动加锁。下面通过一个例子说明,你觉得最后 count 会是多少?

public class Demo {
    private int count;

    public void add() {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        this.count++;
    }

    public static void main(String[] args) {
        Demo d = new Demo();

        // 8个线程同时访问同一个 demo
        new Thread(() -> {d.add();}).start();
        new Thread(() -> {d.add();}).start();
        new Thread(() -> {d.add();}).start();
        new Thread(() -> {d.add();}).start();
        new Thread(() -> {d.add();}).start();
        new Thread(() -> {d.add();}).start();
        new Thread(() -> {d.add();}).start();
        new Thread(() -> {d.add();}).start();

        // 主线程休眠 2 s ,等其他线程执行结束
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(d.count);
    }
}
新手上路,请多包涵

单例和阻塞没有直接关系;阻塞是并发时对访问资源的安全控制手段;常规的可以通过同步关键字、lock、线程局部变量等手段来实现;
单例是一种设计模式,粗浅理解就是为了减少创建实例带来的系统资源的损耗。

单例正常情况下是不会阻塞的,除非你在方法上加synchronized或者其他锁。

新手上路,请多包涵

单例又不是单线程

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题