我想創建一個應該在其他會話中共享的工作線程。基本上我想限制其他用戶執行相同的過程。所以他們會通過我創建的對象線程的靜態實例來檢索線程。如果線程仍然存在,則會提示錯誤。線程對象可以設置爲靜態變量
有沒有其他的方式來做到這一點,因爲我想如果將一個線程對象放在一個靜態是安全的?我也在考慮應用程序上下文,但我不確定哪種方法可以在java中執行此操作?
我想創建一個應該在其他會話中共享的工作線程。基本上我想限制其他用戶執行相同的過程。所以他們會通過我創建的對象線程的靜態實例來檢索線程。如果線程仍然存在,則會提示錯誤。線程對象可以設置爲靜態變量
有沒有其他的方式來做到這一點,因爲我想如果將一個線程對象放在一個靜態是安全的?我也在考慮應用程序上下文,但我不確定哪種方法可以在java中執行此操作?
將任何對象放置在靜態或任何類型的共享位置中都不是本質上不安全的,但您需要注意設計。
聲明
static Thing t;
初始化
if (t == null) {
t = new Thing();
}
使用
t.dosomething();
現在會發生什麼,如果兩個線程在同一時間擊中INITIALISE塊?你可以得到兩件創造的東西。可能不希望這樣,所以使用同步。
synchronized void intialise() {
if (t == null) {
t = new Thing();
}
}
如果兩個線程同時嘗試使用t,會發生什麼情況。這取決於Thing所做的承諾。如果是線程安全沒有問題,否則你的代碼需要提供同步
synchronized void doSomthing() {
t.doSomething();
}
我會爲您設置的靜態字段使用鎖,以避免兩個任務啓動進程的可能性。您可以存儲線程,以便知道何時完成,或者AtomicBoolean在運行時標記。 (您也可以鎖定)
因此,將線程存儲爲靜態是否安全?我的意思是,如果我存儲會話,則其他會話無法訪問。 – Nap
其安全提供線程安全。然而,這不是正常的做法,值得評論爲什麼這樣做。 –
Can Thing be =線程對象? – Nap
事情可能是任何事情,沒有什麼特別的線程對象。 – djna