在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Java/ 關(guān)于多線程請(qǐng)求下的springmvc的controller單例的問題

關(guān)于多線程請(qǐng)求下的springmvc的controller單例的問題

1.springmvc模式下裝載的實(shí)體都是單例模式。那單例中變量共享,測試共享變量在多個(gè)線程請(qǐng)求下回共享。但是類中函數(shù)方法卻沒有阻塞?各路神仙解釋下原因唄?

回答
編輯回答
情未了

單例又不是單線程

2017年12月1日 16:57
編輯回答
舊酒館

單例和阻塞沒有直接關(guān)系;阻塞是并發(fā)時(shí)對(duì)訪問資源的安全控制手段;常規(guī)的可以通過同步關(guān)鍵字、lock、線程局部變量等手段來實(shí)現(xiàn);
單例是一種設(shè)計(jì)模式,粗淺理解就是為了減少創(chuàng)建實(shí)例帶來的系統(tǒng)資源的損耗。

2017年8月5日 16:53
編輯回答
幼梔

單例正常情況下是不會(huì)阻塞的,除非你在方法上加synchronized或者其他鎖。

2018年1月12日 02:36
編輯回答
離魂曲

引用我之前的回答---------
我個(gè)人認(rèn)為是你把單例和線程安全搞混了,單例并不意味著線程安全,多線程同時(shí)訪問單例同樣存在并發(fā)問題,除非你手動(dòng)加鎖。下面通過一個(gè)例子說明,你覺得最后 count 會(huì)是多少?

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個(gè)線程同時(shí)訪問同一個(gè) 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 ,等其他線程執(zhí)行結(jié)束
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(d.count);
    }
}
2017年12月12日 09:22