簡體   English   中英

Web應用程序中的線程安全

[英]Thread safety in web application

這個問題已經困擾了我好幾天了。 對於許多用戶正在訪問該站點的基於客戶的Web應用程序,我是否需要所有后端Java類都是線程安全的? 例如,如果有100個客戶正在訪問我的Web應用程序,那么在jvm中是否每個請求都將單獨的Java對象集分配給他們? 我正在一個Web項目中,沒有一個類是同步的,我想知道多個HTTP請求不共享同一對象嗎?

典型的Web應用程序具有servlet,控制器,服務和數據訪問對象之類的對象,它們沒有會話狀態,因此可以從並發線程安全地進行訪問。 然后是由請求線程創建的持久實體,通常不會傳遞給其他線程,它們的范圍僅限於創建它們的線程。

需要將一些基礎結構對象(例如連接池和Hibernate會話工廠)設計為線程安全的。 但是,如果您使用的是任何合理的框架,則通常不必自己創建這類東西。

假設您設法避免在諸如服務或控制器之類的狀態中不適當地保持狀態,則應用程序最有可能的錯誤源可能是由於開發人員不知道如何使用事務而以非預期的方式交錯數據庫操作。 那就是我要尋找的。 所以三件事:

1)避免在服務,控制器,道之間的對話狀態,

2)使用提供可靠的線程安全基礎架構的框架(spring是一個示例),以及

3)了解數據庫事務,隔離級別和樂觀鎖定,並使用它們來確保不同線程訪問或更改數據而不會損壞。

取決於Web應用程序的用途和要處理的對象。 如果您的Web應用程序只是一個簡單的工具,那么您只需將所有對象和其他數據保留在范圍內,就不必擔心線程安全性。

在線計算器或豬拉丁語翻譯器將是無需擔心線程安全性的工具示例。

一旦開始處理持久數據並同時訪問這些數據,您將需要開始考慮線程安全和可能發生的並發問題。

用戶正在檢查庫存水平並進行購買的在線商店將是需要一些線程安全性的應用程序示例(假設數據存儲在應用程序中)。 您不能讓一個線程(用戶)嘗試檢索一個項目,而另一個線程正在對其進行迭代以嘗試找到另一個。 與使用靜態內存存儲字符串項目的存儲相比,緩存將是一個更好的示例。

在您的示例中,有100個用戶正在訪問您的應用程序,每個客戶將訪問您的應用程序的單獨實例。 這意味着他們發布/接收的數據被隔離為與應用程序自己交互,並且對數據的任何更改都將保存在本地。 如果希望用戶發布/從共享源獲取數據,則需要研究如何進行線程安全和確保並發性。

更明確地回答您的問題;

如果沒有存儲數據的靜態容器類型,那么不需要,您不必擔心線程安全。 這是因為線程之間沒有共同的交互作用。

如果確實有用於存儲數據的靜態容器類型,那么很可能需要考慮線程安全性以確保所有線程都可以安全地訪問數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM