1.springmvc模式下装载的实体都是单例模式。那单例中变量共享,测试共享变量在多个线程请求下回共享。但是类中函数方法却没有阻塞?各路神仙解释下原因呗?
4 回答
三国纷争
TA贡献1804条经验 获得超7个赞
引用我之前的回答---------
我个人认为是你把单例和线程安全搞混了,单例并不意味着线程安全,多线程同时访问单例同样存在并发问题,除非你手动加锁。下面通过一个例子说明,你觉得最后 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);
}
}
缥缈止盈
TA贡献2041条经验 获得超4个赞
单例和阻塞没有直接关系;阻塞是并发时对访问资源的安全控制手段;常规的可以通过同步关键字、lock、线程局部变量等手段来实现;
单例是一种设计模式,粗浅理解就是为了减少创建实例带来的系统资源的损耗。
添加回答
举报
0/150
提交
取消
