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
提交
取消