1. 程式人生 > >SpringMvc的controller是singleton的(非執行緒安全的)

SpringMvc的controller是singleton的(非執行緒安全的)

springmvc的controller是singleton的(非執行緒安全的),這也許就是他和struts2的區別吧
和Struts一樣,Spring的Controller預設是Singleton的,這意味著每個request過來,系統都會用原有的instance去處理,這樣導致了兩個結果:一是我們不用每次建立Controller,二是減少了物件建立和垃圾收集的時間;由於只有一個Controller的instance,當多個執行緒呼叫它的時候,它裡面的instance變數就不是執行緒安全的了,會發生竄資料的問題。

當然大多數情況下,我們根本不需要考慮執行緒安全的問題,比如dao,service等,除非在bean中聲明瞭例項變數。因此,我們在使用spring mvc 的contrller時,應避免在controller中定義例項變數。 

Controller: @Controller
@RequestMapping("/view")
public class DemoController extends BaseController{
private ThreadLocal<Integer> count = new ThreadLocal<Integer>();
private int k=0;
@ResponseBody
@RequestMapping(value="sync",method=RequestMethod.GET)
public String indexSync(){
try{
int i = new Random().nextInt(15);
System.out.println(i);
k=i;
count.set(i);
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SS");
System.out.println("-->"+sf.format(new Date())+"   Threadname:"+Thread.currentThread().getName());
Thread.sleep(5*1000);
System.out.println("-->1--:"+sf.format(new Date())+"   Threadname:"+Thread.currentThread().getName());
synchronized (DemoController.class) {
System.out.println("-->2--:"+sf.format(new Date())+"   Threadname:"+Thread.currentThread().getName());
Thread.sleep(10*1000);
}
System.out.println("-->3--:"+sf.format(new Date())+"   Threadname:"+Thread.currentThread().getName());
System.out.println("count:"+count.get()+" ,k="+k);
}catch(Exception e){
e.printStackTrace();
}
return "suc";
}

}

結果:

4
-->2016-04-24 00:05:25:957   Threadname:qtp1173631672-26
11
-->2016-04-24 00:05:26:209   Threadname:qtp1173631672-28
-->1--:2016-04-24 00:05:30:958   Threadname:qtp1173631672-26
-->2--:2016-04-24 00:05:30:958   Threadname:qtp1173631672-26
-->1--:2016-04-24 00:05:31:209   Threadname:qtp1173631672-28
-->3--:2016-04-24 00:05:40:959   Threadname:qtp1173631672-26
-->2--:2016-04-24 00:05:40:959   Threadname:qtp1173631672-28
count:4 ,k=11
-->3--:2016-04-24 00:05:50:959   Threadname:qtp1173631672-28
count:11 ,k=11

總結:

1、springmvc的成員是非執行緒安全的
2、在Controller中使用ThreadLocal變數
3、在spring配置檔案Controller中宣告 scope="prototype",每次都建立新的controller
所在在使用spring開發web 時要注意,預設Controller、Dao、Service都是單例的。
4、因為springmvc是單例模式,所以影響同時互斥請求




相關推薦

SpringMvc的controller是singleton的執行安全

springmvc的controller是singleton的(非執行緒安全的),這也許就是他和struts2的區別吧 和Struts一樣,Spring的Controller預設是Singleton的,這意味著每個request過來,系統都會用原有的instance去處理,

1.JVM之對Vector執行安全的測試相對執行安全

import java.util.Vector; public class vector { private static Vector<Integer> vector=new Vector<>(); public static void main(Stri

iOS程式碼重構CoreData多執行支援執行安全

CoreData對多執行緒的支援比較奇怪(按照一般的思路來說),CoreData的NSPersistentStoreCoordinator和NSManagedObjectContext物件都是不能跨執行緒使用的,NSManagedObject也不行,有人想加鎖不就完了。 前

C/C++程式設計教訓----函式內靜態類物件初始化執行安全C++11之前

不少程式設計師在編寫程式的時候,會使用函式內靜態(static)變數,既能滿足函式內這個變數可以持久的記錄某些資訊,又使其訪問範圍的控制侷限於函式內。但函式內靜態類物件初始化是非執行緒安全的。 問題背景 在我們產品中對log4cxx做了一些簡單的封裝 (採用VS2005編譯),其中會

Java之多執行安全屌絲版,兩大解決思路,要麼不去競爭開闢執行副本、要麼有順序的競爭資源用鎖規定執行秩序

0、多執行緒安全,如果多個執行緒操作一個變數,每次都能達到預期的結果,那麼說明當前這個類起碼是執行緒安全的,我這白話的,可能有點噁心。   1、看看牛人是怎麼說的,為什麼多執行緒併發是不安全的? 在作業系統中,執行緒是不再擁有資源的,程序是擁有資源的。而執行緒是由程序建立的

SimpleDateFormatPool日期格式化類池工具執行安全

轉載請註明出處: https://blog.csdn.net/jevonsCSDN/article/details/83092795 【Jevons’Blog】 SimpleDateFormat是一個非執行緒安全類,當高併發時,若共用一個format物件,則

javaSE (三十五執行 執行實現方法和區別、同步程式碼塊和方法執行安全

主要還是熟悉api,熟悉方法,簡單,需要多實踐 1、 多執行緒實現方法和區別: 多執行緒實現的兩種方法: 1)類繼承Thread類或實現Runnable介面,重寫run()方法 2)建立Thread的子類物件(需要開幾個執行緒就建立幾個物件,可建立匿名內部類) 3)子類

設計模式之單例模式執行安全

可以說單例模式是所有設計模式中最簡單的一種。 單例模式就是說系統中對於某類的只能有一個物件,不可能出來第二個 單例模式也是23種設計模式中在面試時少數幾個會要求寫程式碼的模式之一。主要考察的是多執行緒下面單例模式的執行緒安全性問題。 1.多執行緒安全單例模式例項

執行控制執行同步 & 執行安全

一、執行緒同步        當多個控制執行緒共享相同的記憶體時,需要確保每個執行緒看到一致的資料。如果當某個執行緒可以去修改變數,而其他執行緒也可以去讀取或者修改這個變數的時候,就需要對這些執行緒進行同步控制,以確保它們在訪問變數的儲存內容時不會訪問到無效的數值。    

java單例模式執行安全

package cn.yang.test.controller; /**單例模式 * Created by Dev_yang on 2016/2/26. */ public class Singl

Java日期計算類執行安全

package com.mcp.util; public enum DateStyle { YYYY_MM("yyyy-MM", false), YYYY_MM_DD("yyyy-MM-dd", false), DD("dd", false), YYYYMMD

c++、設計模式之單例模式餓漢,懶漢,執行安全

單例模式:單例模式,是一種常用的軟體設計模式。在它的核心結構中只包含一個被稱為單例的特殊類。通過單例模式可以保證系統中,應用該模式的類一個類只有一個例項。即一個類只有一個物件例項。如何保證一個類只有一個例項並且這個例項易於被訪問呢?定義一個全域性變數可以確保物件隨時都可以被訪

關於JVM記憶體執行共享與執行共享

大多數 JVM 將記憶體區域劃分為 Method Area(Non-Heap)(方法區) ,Heap(堆) , Program Counter Register(程式計數器) , VM Stack(虛擬機器棧,也有翻譯成JAVA 方法棧的),Native M

執行安全執行安全

1、執行緒不共享資料 對同一資源,各個執行緒各自執行一遍,程式碼如下: package com.zzm.th01; /** * 執行緒不共享資料 * Created by ming on 2017/6/15. */ public class th04 extends Thr

SimpleDateFormat執行安全測試

package gulixueyuan_jdk18; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; imp

(轉)PHP執行安全執行安全的區別:如何選擇用哪一個?

PHP執行緒安全與非執行緒安全的區別:如何選擇用哪一個? 很多時候,我們在做PHP環境配置的時候,很多人都是直接去亂下載PHP版本的,但是他不清楚:從2000年10月20日釋出的第一個Windows版的PHP3.0.17開始的都是執行緒安全的版本,直至5.2.1版本開始有Thread Safe

java中執行安全執行安全的集合

  執行緒安全 非執行緒安全 Collection Vector ArrayList、LinkedList   H

8-DCL double-check locks(指令重排序導致的執行安全問題)

DCL double-check locks(指令重排序導致的非執行緒安全問題) 單例模式1: 非執行緒安全模式 問題:多執行緒環境下,可能多個執行緒singleton == null,導致new多個例項物件 單例模式

Java-時間等待執行睡眠

  Java-時間等待 1 TimeUnit.DAYS.sleep(1);//天 2 TimeUnit.HOURS.sleep(1);//小時 3 TimeUnit.MINUTES.sleep(1);//分 4 TimeUnit.SECONDS.sleep(1);//秒

24執行3

1 單例設計模式 保證類在記憶體中只有一個物件。有三種寫法,下面分別介紹 (1)餓漢式 為什麼叫它餓漢式寫法呢,因為它在建立類的時候,不管三七二十一就直接建立了s物件,也不管s會不會被使用,相反,還有一種寫法叫懶漢式寫法。 (2)懶漢式(單例延遲載入模式) 多執行