1. 程式人生 > >Request和Response的執行緒安全問題的另一個解決方案

Request和Response的執行緒安全問題的另一個解決方案

Zigzag Chen的Swato框架提供了RequestAware和SessionAware介面,如果你的service需要訪問Request或Response物件,需要實現RequestAware或SessionAware.在Swato的JSONServlet中呼叫你的service的setRequest, setResponse, setSession等之類的方法把Request, Response, Session注入 -- 但你的service自身需要解決執行緒安全問題,我原先的解決方案是,在service中整個Map,實現sessionId到Request, Response, Session的對映,這樣每個session對應map中的一個entry,就不用擔心不同執行緒的Request, Response, Session之間的相互覆蓋問題了。
最近對程式碼進行了一番重構,總感覺這種執行緒安全問題的解決方案不夠優雅。
看過JForum的原始碼,從他那裡學了一招,於是一種更優雅的解決方案產生了:

/*
* Copyright (c) JForum Team
* All rights reserved.
*
* Redistribution and use in source and binary forms,
* with or without modification, are permitted provided
* that the following conditions are met:
*
* 1) Redistributions of source code must retain the above
* copyright notice, this list of conditions and the
* following disclaimer.
* 2) Redistributions in binary form must reproduce the
* above copyright notice, this list of conditions and
* the following disclaimer in the documentation and/or
* other materials provided with the distribution.
* 3) Neither the name of "Rafael Steil" nor
* the names of its contributors may be used to endorse
* or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
* HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
* BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
* THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
* IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
*
* This file creation date: 29/01/2006 - 12:19:11
* The JForum Project
* http://www.jforum.net
*/
package com.grs.context;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
* A request and response container -- thread-safe
*
* @author Rafael Steil
* @author Sam Chen
* @version 1.0 03/24/2008
*/
public class ExecutionContext {
private static ThreadLocal<ExecutionContext> userData = new ThreadLocal<ExecutionContext>();
private HttpServletRequest request;
private HttpServletResponse response;

/**
* Gets the execution context.
* @return ExecutionContext
*/
private static ExecutionContext getInstance() {
ExecutionContext ex = userData.get();

if (ex == null) {
ex = new ExecutionContext();
userData.set(ex);
}

return ex;
}

/**
* Sets the current thread's request
* @param request
*/
public static void setRequest(HttpServletRequest request) {
ExecutionContext.getInstance().request = request;
}
/**
* Gets the current thread's request
* @return HttpServletRequest
*/
public static HttpServletRequest getRequest() {
return ExecutionContext.getInstance().request;
}

/**
* Sets the current thread's response
* @param response
*/
public static void setResponse(HttpServletResponse response) {
ExecutionContext.getInstance().response = response;
}
/**
* Gets the current thread's response
* @return HttpServletResponse
*/
public static HttpServletResponse getResponse() {
return ExecutionContext.getInstance().response;
}

}



有了這個Context,只需要在JSONServlet先調

ExecutionContext.setRequest(request);
ExecutionContext.setResponse(response);

然後在service呼叫

ExecutionContext.getRequest();
ExecutionContext.getResponse();

即可分別得到對應於當前執行緒的Request和Response

相關推薦

SimpleDateFormat的執行安全問題與解決方案

轉載自: http://www.cnblogs.com/zemliu/archive/2013/08/29/3290585.html 1. 原因 SimpleDateFormat(下面簡稱sdf)類內部有一個Calendar物件引用,它用來儲存和這個sd

Java併發程式設計--執行安全問題與解決方案

本文簡介: 用多執行緒開發的人都知道,在多執行緒的開發過程中有可能會出現執行緒安全問題(專業術語叫記憶體可見性問題),但並不一定每次都會出現。出現這樣的情況,也會另開發者頭皮發麻,無從下手,接下來我們會慢慢深入,揭開多執行緒的神祕面紗。 本文主要介紹了Jav

SimpleDateFormat 的執行安全問題與解決方案

1. 原因 SimpleDateFormat(下面簡稱sdf)類內部有一個Calendar物件引用,它用來儲存和這個sdf相關的日期資訊,例如sdf.parse(dateStr), sdf.format(date) 諸如此類的方法引數傳入的日期相關String, Date等

RequestResponse執行安全問題的一個解決方案

Zigzag Chen的Swato框架提供了RequestAware和SessionAware介面,如果你的service需要訪問Request或Response物件,需要實現RequestAware或SessionAw

一個執行控制一個執行的暫停或啟動

MainTest類中可以控制執行緒的暫停或繼續執行。 public class MainTest { /** * 這個執行緒操作另一個執行緒的暫停或開始 * @param args */ public static void main(String[] args) {

struts1 struts2 執行安全

首先我們必須要先了解servlet的生命週期: 伺服器只建立每個servlet的單一例項,首次建立servlet時,它的init方法會被呼叫,因此,init是放置一次性設定程式碼的地方,之後,針對每個使用者的請求都會建立一個執行緒,該執行緒呼叫前面建立的例項方法。多個併發請求一般會導致多

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

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

Springmvc獲取request物件&執行安全

概述:在使用Springmvc開發web系統時,經常要用到request物件來處理請求,比如獲取客戶端IP地址、請求的url、header中的屬性(cookie、授權資訊等)、body中的資料等。由於Springmvc中的Controller、Service等都是單例的,因此就需要關注request物件是否是

Win32執行——等待一個執行結束

轉載: https://blog.csdn.net/yss28/article/details/53646627 《Win32多執行緒程式設計》–Jim Beveridge & Robert Wiener “等待某個什麼東西”是執行緒常常需要做的事。等待是執行緒

PHP版本中執行安全執行安全的區別

Windows版的PHP從版本5.2.1開始有Thread Safe(c之分,這兩者不同在於何處?到底應該用哪種?這裡做一個簡單的介紹。 從2000年10月20日釋出的第一個Windows版的PHP3.0.17開始的都是執行緒安全的版本,這是由於與Linux/Unix系統

Java多執行執行安全執行安全的集合物件

轉載:https://blog.csdn.net/u011389474/article/details/54602812一、概念:執行緒安全:就是當多執行緒訪問時,採用了加鎖的機制;即當一個執行緒訪問該類的某個資料時,會對這個資料進行保護,其他執行緒不能對其訪問,直到該執行緒

Python 執行條件(Condition),(執行等待一個執行執行)

執行緒1執行(cond),執行緒1執行一半等待(cond.wait()),執行緒2開始執行(cond),執行緒2執行完畢後(cond.notify()),執行緒1再接著執行。 import threading import time def go1(): wit

執行之join()方法---(Thread提供的讓一個執行等待一個執行完成的方法)

package Demo1; /** * Created by Petty on 2017/4/9. */ public class Thread_1 extends Thread {

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

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

執行中的方法、兩種實現方式、匿名內部類建立多執行執行安全問題的解決

多執行緒兩種實現方式: 方式一: 繼承Thread類的方式 方式二: 實現Runnable介面的方式。 方式一: 步驟: // 1. 定義一個類,然後繼承Thread //

java中執行安全問題如何解決?

執行緒安全問題解決方法: 在程式碼中使用同步程式碼塊(同步鎖) 解釋:在某一段任務中,同一時間只允許一個執行緒執行任務,其他的執行緒即使搶到了cpu,也無法進入當前的任務區間,只有當 當前的執行緒將任務執行完後,其他的執行緒才有資格進入. 同步程式碼塊的構成: sy

關於多執行在簡單的懶漢模式下執行安全問題的解決

一個簡單的懶漢模式,例如: public class SingleTonDemo { public static void main(String[] args) { // TODO Aut

執行,子執行資源衝突,解決方案

問題描述,  我開發的任性動圖軟體,曾經遇到過這樣的問題:      任性動圖有一個功能是塗鴉功能,就是將你的塗鴉過程生成動圖,怎麼實現的呢?      有一個主顯示記憶體,用以顯示介面影象  

Java執行死鎖及解決方案

要了解執行緒死鎖,首先要明白什麼是死鎖 死鎖 通俗點講:死鎖就是兩個或兩個以上的程序或執行緒在執行過程中,由於競爭資源或者由於彼此通訊而造成的一種阻塞的現象,若無外力作用,它們都將無法推進下去。 用簡單一點的例子來說吧 比如這個交通堵塞的例子,從圖中可以看到四個方向行駛

關於SpringMVC攔截器是否執行安全及多執行訪問產生的requestsession

Springmvc的攔截器預設是執行緒不安全,即全域性屬性就是共享的即不執行緒安全(如下程式碼中變數i就是執行緒不安全的)。 定義了一個攔截器: 並配置了一個SessionListener(關於JavaWeb的Listener配置這裡沒貼程式碼): 設定sess