我有,我必須實現一個接口命名打印所使用框架的Web應用程序:如何使用ThreadLocal(特別是與Servlets)?
interface Plot {
Image getImage();
String getTitle();
}
我知道框架調用getTitle()
前getImage()
。在某些情況下,我需要圖像生成的結果來創建標題。
我知道,如果我做了什麼天真這樣的:
class MyNaivePlot implements Plot {
private String title;
public Plot getImage() {
title = "...";
}
public String getTitle() { return title; }
}
然後,我可以介紹的競爭條件。看來我可以通過使用ThreadLocal
來解決這個問題,但我還沒有看到足夠的例子來知道我的解決方案是否正確(並且這些類型的東西很難以確定的方式進行測試)。所以這裏是我想出的:
class MyThreadLocalPlot implements Plot {
private ThreadLocal<String> title = new ThreadLocal<String>();
public Plot getImage() {
title.set("...");
}
public String getTitle() {
return title.get();
}
}
這是否足夠?我正確使用ThreadLocal
嗎?請注意,我只需要將標題掛起足夠長的時間,直到getTitle()
爲止。我不在乎它之後的價值是什麼,也不在getImage()
之前。
另請注意,我相信框架「長命」了MyPlot
對象,並且不會爲每個請求/線程創建一個新對象,否則這將是一個非問題。
謝謝!
這個類是如何調用的?它是爲每個請求instanciated?或只是一次? – chburd
*然後我可以介紹一個競賽條件*:你能詳細說明一下嗎?你有多少個這個班的實例?他們是如何創建的?他們如何以及爲什麼在線程之間共享? –
你的線程局部變量應該是靜態的最後 – Scorpion