Request和Response的執行緒安全問題的另一個解決方案
最近對程式碼進行了一番重構,總感覺這種執行緒安全問題的解決方案不夠優雅。
看過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等
Request和Response的執行緒安全問題的另一個解決方案
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攔截器是否執行緒安全及多執行緒訪問產生的request和session
Springmvc的攔截器預設是執行緒不安全,即全域性屬性就是共享的即不執行緒安全(如下程式碼中變數i就是執行緒不安全的)。 定義了一個攔截器: 並配置了一個SessionListener(關於JavaWeb的Listener配置這裡沒貼程式碼): 設定sess