[問題] 關於靜態變數的存取
我寫了一段存取靜態變數的code:
public class SetConnectionsServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
......
public static List<Connection> list = new ArrayList<>();
}
然後我透過多執行緒,取得connection物件,並寫入上面那個arrayList:
SetConnectionForMultiThread[] smtArray = new SetConnectionForMultiThread[200];
Thread[] thrArray = new Thread[200];
int j = 0;
for(int i = 0;i<200;i++){
smtArray[j] =
new SetConnectionsForMultiThread();
thrArray[j] = new Thread(smtArray[j]);
thrArray[j].start();
j++;
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
然後在SetConnectionForMultiThread這個class裡:
public class SetConnectionForMultiThread implements Runnable{
public void run(){
......
SetConnectionsServlet.list.add(connection);
}
}
-----------------------------------------
原本我以為只要執行到上面那行黃色部分,就能將取得的connection物件加到該arrayList
但是並沒有;但是如果我直接在SetConnectionForMultiThread這個class內新增另一
arrayList:
public static List<Connection> list = new ArrayList<Connection>();
然後加入connection物件的寫法,變成
SetConnectionForMultiThread.list.add(connection);
這樣就又可以將connection物件加到list了。
-------------------------------------------
請問這兩種寫法,不是都是將物件加到靜態的list裡?為何前者會沒有加成功呢?
這兩者的差異在哪呢?
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.160.27.159
※ 文章網址: https://www.ptt.cc/bbs/java/M.1544848244.A.CF0.html
→
12/15 13:14,
6年前
, 1F
12/15 13:14, 1F
→
12/15 13:14,
6年前
, 2F
12/15 13:14, 2F
我已經改成
synchronized(SetConnectionsServlet.list){
SetConnectionsServlet.list.add(connection);
}
但還是一樣。
我加上以下的CODE:
for(int k = 0;k<j;k++){
try {
thrArray[k].join();
System.out.println("join:"+k);
} catch (Exception e) {
e.printStackTrace();
}
}
在DEBUG模式下執行,然後就發現執行第一個join之後,debug模式就沒繼續跑了。
這可能跟SetConnectionsServlet.list已經被鎖定有關?
推
12/15 13:16,
6年前
, 3F
12/15 13:16, 3F
推
12/15 22:38,
6年前
, 4F
12/15 22:38, 4F
兩個不同類別名的 Multi?樓上可以講得更清楚點嗎?
→
12/16 13:21,
6年前
, 5F
12/16 13:21, 5F
→
12/16 13:23,
6年前
, 6F
12/16 13:23, 6F
原本的CODE就有寫j++,只是我複製的時候漏掉了。現在補上。
※ 編輯: lueichun (36.230.18.161), 12/16/2018 14:17:25
→
12/16 23:44,
6年前
, 7F
12/16 23:44, 7F
java 近期熱門文章
PTT數位生活區 即時熱門文章