2014-04-28 40 views
-2

在下面的代碼中,我想讓get_data變量爲線程安全的。 爲我提供了一些代碼。如何讓servlet實例變量線程安全?

public class Home_page_action extends HttpServlet { 

String get_data; 

    public void doGet(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 

       } 

} 
+5

「請給我提供了一些代碼,」這些話都被列入黑名單的堆棧溢出。 ;) –

+2

不,你不想把實例變量放在一個servlet中。他們 - 必須 - 保持無國籍,這是合同的一部分。如果要保存數據,請將其保存在會話或應用程序範圍中。 – Gimby

+0

這個問題似乎是脫離主題,因爲SO不是「Gimme代碼」服務。 –

回答

1

首先建議,請不要製作實例變量。由於只有一個創建的servlet副本,所以唯一的線程安全變量是方法內部的自動變量。

局部變量總是線程安全的。 請記住,雖然局部變量指向的對象可能不是這樣。 如果對象是在方法內部實例化的,並且永遠不會逃脫,那麼就沒有問題了。另一方面,指向某個共享對象的局部變量仍可能導致問題。 僅僅因爲您將共享對象分配給本地引用,並不表示該對象會自動變爲線程安全。

請求和響應對象當然可以線程安全地使用。 爲您的servlet中的每個請求創建這些實例的新實例,從而爲servlet中執行的每個線程創建這些實例。

0

java.util.concurrent.atomic軟件包是您在找的內容,您可以在此軟件包中使用AtomicXXX版本的可用類型。

這個包是

的支持無鎖的線程安全的單變量 編程類的小工具包。

Java document給出的例子:

import java.util.concurrent.atomic.AtomicInteger; 

class AtomicCounter { 
    private AtomicInteger c = new AtomicInteger(0); 

    public void increment() { 
     c.incrementAndGet(); 
    } 

    public void decrement() { 
     c.decrementAndGet(); 
    } 

    public int value() { 
     return c.get(); 
    } 

}