java網(wǎng)絡(luò)接口對傳入的參數(shù)進行加鎖

第一次寫技術(shù)文檔,因為擔(dān)心很多以前做過的東西,又要接著做一遍。所以開始寫一些東西記錄一下。

問題:如果寫一個接口,其他人調(diào)用這個結(jié)果的時候,根據(jù)接口的參數(shù)來加鎖。

環(huán)境:因為沒有寫demo 的習(xí)慣,所以都是直接在真實項目里面做的示例。

        后臺:Spring boot 寫的接口

        前臺:vue 寫的網(wǎng)絡(luò)請求

話不多說:上代碼

   @GetMapping(value = "/he/{username}")
    public  String setexcle2(@PathVariable String username) {
    StringBuffer sb=new StringBuffer();
    sb.append(username);

    synchronized(sb.toString().intern()) {
        System.out.println(username);
        try {
            //延時3秒執(zhí)行
            Thread.currentThread().sleep(3000);
        } catch (InterruptedException ie) {
            ie.printStackTrace();
        }
        String username2 = username + "運算結(jié)果:::::: ";
        System.out.println(username2);
    }
    return "你好!世界" + username;
}

這個就是一個get請求的接口:接口地址是 本機ip:8080/main/he,當然這個不重要。重要的是里面的方法。

Paste_Image.png

這就是關(guān)鍵。
原因是
再看String

JVM內(nèi)存區(qū)域里面有一塊常量池,關(guān)于常量池的分配:

JDK6的版本,常量池在持久代PermGen中分配
JDK7的版本,常量池在堆Heap中分配
字符串是存儲在常量池中的,有兩種類型的字符串數(shù)據(jù)會存儲在常量池中:

1.編譯期就可以確定的字符串,即使用""引起來的字符串,比如String a = "123"、String b = "1" + B.getStringDataFromDB() + "2" + C.getStringDataFromDB()、這里的"123"、"1"、"2"都是編譯期間就可以確定的字符串,因此會放入常量池,而B.getStringDataFromDB()、C.getStringDataFromDB()這兩個數(shù)據(jù)由于編譯期間無法確定,因此它們是在堆上進行分配的

2.使用String的intern()方法操作的字符串,比如String b = B.getStringDataFromDB().intern(),盡管B.getStringDataFromDB()方法拿到的字符串是在堆上分配的,但是由于后面加入了intern(),因此B.getStringDataFromDB()方法的結(jié)果,會寫入常量池中

3.常量池中的String數(shù)據(jù)有一個特點:每次取數(shù)據(jù)的時候,如果常量池中有,直接拿常量池中的數(shù)據(jù);如果常量池中沒有,將數(shù)據(jù)寫入常量池中并返回常量池中的數(shù)據(jù)。

因此回到我們之前的場景,使用StringBuilder拼接字符串每次返回一個new的對象,但是使用intern()方法則不一樣:

接下來就是測試了:
在vue里面進行測試,我們循環(huán)5次,每次里面放2個請求,一個相同,一個不同。看看執(zhí)行的結(jié)果。

         posthttp(){
                 let that = this;
                      for(var i=0;i<5;i++){
                   that.$http({
                    url: "http://localhost:8090/main/he/哇哈哈"+(i),
                      method: 'get',
               }).then((res) => {
      console.log(res);
    }).catch((res) => {
      console.log('SideSec.vue :', res);
    });
    that.$http({
      url: "http://localhost:8090/main/he/測試",
      method: 'get',
    }).then((res) => {
      console.log(res);
    }).catch((res) => {
      console.log('SideSec.vue :', res);
    });
  }

最后我們執(zhí)行這個vue程序 。
npm run dev

Paste_Image.png

最后我們看看控制臺的打印

Paste_Image.png

可以看出 請求參數(shù)為測試的 都是加了鎖 同步的。哇哈哈1 哇哈哈2 就是沒有同步的。

忽然感覺寫的很爛,準備把名字改了。

Paste_Image.png

這樣我們就能看出這里李四是同步了的。

第一次寫技術(shù)博客,爛到家了,見諒。見諒。見諒。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Java內(nèi)存分配與管理是Java的核心技術(shù)之一,一般Java在內(nèi)存分配時會涉及到以下區(qū)域: 寄存器:我們在程序中無...
    yekai閱讀 388評論 0 3
  • 前言 不知道大家有沒有這樣一種感覺,程序員的數(shù)量井噴了??赡苁且驗榛ヂ?lián)網(wǎng)火了,也可能是各家培訓(xùn)機構(gòu)為我們拉來了大量...
    活這么大就沒飽過閱讀 2,837評論 6 25
  • 轉(zhuǎn)自:http://blog.csdn.net/jackfrued/article/details/4492194...
    王帥199207閱讀 8,795評論 3 93
  • ??需要說明的一點是,這篇文章是以《深入理解Java虛擬機》第二版這本書為基礎(chǔ)的,這里假設(shè)大家已經(jīng)了解了JVM的運...
    Geeks_Liu閱讀 14,279評論 5 44
  • 這個星期你都是上早班,下午3點就下班了。星期天的那天晚上,我跟你提了個建議:你那么早下班,等我下班回來就去跑步唄。...
    瑩光豬閱讀 817評論 0 0

友情鏈接更多精彩內(nèi)容