1. 程式人生 > >Spring 是如何解決併發訪問的執行緒安全性問題的

Spring 是如何解決併發訪問的執行緒安全性問題的

        springmvc的controller是singleton的(非執行緒安全的),這也許就是他和struts2的區別吧!和Struts一樣,Spring的Controller預設是Singleton的,這意味著每個request過來,系統都會用原有的instance去處理,這樣導致了兩個結果:一是我們不用每次建立Controller,二是減少了物件建立和垃圾收集的時間;由於只有一個Controller的instance,當多個執行緒呼叫它的時候,它裡面的instance變數就不是執行緒安全的了,會發生竄資料的問題。當然大多數情況下,我們根本不需要考慮執行緒安全的問題,比如dao,service等,除非在bean中聲明瞭例項變數。因此,我們在使用spring mvc 的contrller時,應避免在controller中定義例項變數。 

       如果控制器是使用單例形式,且controller中有一個私有的變數a,所有請求到同一個controller時,使用的a變數是共用的,即若是某個請求中修改了這個變數a,則,在別的請求中能夠讀到這個修改的內容。。

有幾種解決方法:
1、在Controller中使用ThreadLocal變數
2、在spring配置檔案Controller中宣告 scope="prototype",每次都建立新的controller

所在在使用spring開發web 時要注意,預設Controller、Dao、Service都是單例的。

ThreadLocal 使用範例:

 ThreadLocal<Long>

startTime = newThreadLocal<Long>();  定義一個ThreadLocal 變數

startTime.set(System.currentTimeMillis());   寫入值

startTime.get();  讀取值

ThreadLocal和執行緒同步機制相比有什麼優勢呢?

ThreadLocal和執行緒同步機制都是為了解決多執行緒中相同變數的訪問衝突問題。

在同步機制中,通過物件的鎖機制保證同一時間只有一個執行緒訪問變數。這時該變數是多個執行緒共享的,使用同步機制要求程式慎密地分析什麼時候對變數進行讀寫,什麼時候需要鎖定某個物件,什麼時候釋放物件鎖等繁雜的問題,程式設計和編寫難度相對較大。

而ThreadLocal則從另一個角度來解決多執行緒的併發訪問。ThreadLocal會為每一個執行緒提供一個獨立的變數副本,從而隔離了多個執行緒對資料的訪問衝突。因為每一個執行緒都擁有自己的變數副本,從而也就沒有必要對該變數進行同步了。ThreadLocal提供了執行緒安全的共享物件,在編寫多執行緒程式碼時,可以把不安全的變數封裝進ThreadLocal。

概括起來說,對於多執行緒資源共享的問題,同步機制採用了“以時間換空間”的方式,而ThreadLocal採用了“以空間換時間”的方式。前者僅提供一份變數,讓不同的執行緒排隊訪問,而後者為每一個執行緒都提供了一份變數,因此可以同時訪問而互不影響。

相關推薦

淺談Semaphore類 如何控制某個方法允許併發訪問執行的個數?

Semaphore類有兩個重要方法 1、semaphore.acquire(); 請求一個訊號量,這時候訊號量個數-1,當減少到0的時候,下一次acquire不會再執行,只有當執行一個release()的時候,訊號量不為0的時候才可以繼續執行acquire 2、semaphore.release();

Java併發基礎—執行安全性

執行緒安全性         當多個執行緒訪問某個類時,不管執行時環境採用何種排程方式或者這些程序如何交替執行,並且在主調程式碼中無需任何額外的同步或協同,這個類都能表現出正確的行為,那麼就稱這個類是執行緒安全的。 執行緒安全性——原子性         提供了互斥訪問

Java併發程式設計(8)-使用閉鎖測試併發執行安全性

本文將介紹什麼是閉鎖,在java中的閉鎖實現:CountDownLatch類及其常用方法等,最後給出了一個使用閉鎖模擬執行緒併發的demo,用以簡單地測試任務是否為執行緒安全。 一、什麼是閉鎖 閉鎖(Latch)是在併發程式設計中常被提及的概念。閉鎖是一

Guava併發:RateLimiter限制資源的併發訪問執行

RateLimiter類似於JDK的訊號量Semphore,他用來限制對資源併發訪問的執行緒數。 RateLimiter limiter = RateLimiter.create(4.0); //每秒不超過4個任務被提交 limiter.acquire();  //請求Ra

Spring 是如何解決併發訪問執行安全性問題的

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

Spring併發訪問執行安全性問題總結

好像是在去年畢業面試的時候,面試官問了我這個問題,如何保證Spring併發訪問的執行緒安全問題,當時的我也只是對這些有所瞭解,僅僅知道spring中的controller、serivce、dao預設為單例,只要不在這些單例中使用成員變數就可以了,然後工作至今,我還是對其中原理

Spring併發訪問執行安全性問題(高度總結)

spring中的併發訪問題: 我們知道在一般情況下,只有無狀態的Bean才可以在多執行緒環境下共享,在Spring中,絕大部分Bean都可以宣告為singleton作用域。 那麼對於有狀態的bean呢?Spring對一些(如RequestContextHolder、Tra

Spring併發訪問執行安全性問題

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

SpringMVC 併發訪問執行安全性問題

首先對於spring的IOC來說,物件是由Spring來幫我們管理,也就是在Spring啟動的時候,在Spring容器中,由Spring給我們建立的,Spring會幫我們維護,一般都是單例的,也就是一個物件。 spring生成物件預設是單例的。通過scope屬性可以更改為多例。 第一部分:驗證Spring

併發程式設計與高併發解決方案學習(常見類執行安全性研究)

StringBuilder 非執行緒安全import com.mmall.concurrency.annoations.NotThreadSafe; import lombok.extern.slf4j.Slf4j; import java.util.concurrent.

Spring 中的執行安全性

Spring與執行緒安全   Spring作為一個IOC/DI容器,幫助我們管理了許許多多的“bean”。但其實,Spring並沒有保證這些物件的執行緒安全,需要由開發者自己編寫解決執行緒安全問題的程式碼。   Spring對每個bean提供了一個s

Java併發理論基礎—執行安全性

執行緒安全性         當多個執行緒訪問某個類時,不管執行時環境採用何種排程方式或者這些程序如何交替執行,並且在主調程式碼中無需任何額外的同步或協同,這個類都能表現出正確的行為,那麼就稱這個類是執行緒安全的。 執行緒安全性——原子性 &nbs

併發程式設計從入門到放棄1--執行安全性

什麼是執行緒安全性?        當多個執行緒訪問某個類時,不管執行時環境採用何種排程方式或者這些程序將如何交替執行,並且在主調程式碼中不需要任何額外的同步或協同,這個類都能表現出正確的行為,那麼就稱這個類是執行緒安全的。 執行緒安全性包括原子性,可見性

Spring中的執行安全性

一:Spring與執行緒安全 Spring作為一個IOC/DI容器,幫助我們管理了許許多多的“bean”。但其實,Spring並沒有保證這些物件的執行緒安全,需要由開發者自己編寫解決執行緒安全問題的程式碼。 Spring對每個bean提供了一個scope屬性來表示該bean的作用域。它是be

Java併發程式設計(9)-使用閉鎖測試併發執行安全性

文章目錄 一、什麼是閉鎖 二、CountDownLatch類介紹 2.1、什麼是CountDownLatch 2.2、構造方法 2.3、主要方法 三、使用閉鎖完成併

併發程式設計實戰(1):執行安全性之有狀態和無狀態物件

程序和執行緒的區別 程序是具有一定獨立功能的程式關於某個資料集合上的一次執行活動,程序是系統進行資源分配和排程的一個獨立單位. 執行緒是程序的一個實體,是CPU排程和分派的基本單位,它是比程序更小的能獨立執行的基本單位. 程序在執行過程中擁有獨立的記憶體單元,程序

《java併發程式設計實戰》之 執行安全性

1.執行緒安全性 當多個執行緒訪問某個類時,不管執行時環境採用何種排程方式或者這些執行緒將如何交替執行,並且在主調程式碼中不需要任何額外的同步或協同,這個類都能表現出正確的行為,那麼這個類就是執行緒安全的。 無狀態物件一定是執行緒安全的,何為無狀態,就是類中不包含任何域,也不包含各種其

[讀書筆記][Java併發程式設計實戰]第二章 執行安全性

                                          第二章 執行緒安全性 1-什麼是執行緒安全的類? 當多個執行緒訪問某一個類時,不管執行時環境採用何種排程方式或者這些執行緒將如何交替執行,並且在主調程式碼中不需要任何額外的同步或協同,這個

併發實戰 之「 執行安全性

溫馨提示:本系列博文(含示例程式碼)已經同步到 GitHub,地址為「java-skills」,歡迎感興趣的童鞋Star、Fork,糾錯。 在早期的計算機中不包含作業系統,它們從頭到尾只能執行一個程式,並且這個程式能訪問計算機中的所有資源。在這種環境中,不僅

(十六)java併發程式設計--執行的死鎖解決方案(生產者和消費者幾種實現方式)

上一篇中,主要了解了什麼時候死鎖,並且提出死鎖的一個解決方案,多個鎖要按照一定的順序來。 本片主要是利用生產者消費者模式解決執行緒的死鎖。 多執行緒生產者和消費者一個典型的多執行緒程式。一個生產者生產提供消費的東西,但是生產速度和消費速度是不同的。這就需要讓