作者lueichun (no anonymous)
看板java
标题[问题] 关於静态变数的存取
时间Sat Dec 15 12:30:42 2018
我写了一段存取静态变数的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://webptt.com/cn.aspx?n=bbs/java/M.1544848244.A.CF0.html
1F:→ ssccg: 没有差,不是其他地方写错就是判断有没有加的方法是错的 12/15 13:14
2F:→ ssccg: 另外会被多个thread存取的list需要synchronize 12/15 13:14
我已经改成
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已经被锁定有关?
3F:推 gasbomb: 原本class底下写一个addList()给其他class用比较妥当吧 12/15 13:16
4F:推 AI3767: 我写一个测试是ok的, 但,你有两个不同类别名的 Multi 12/15 22:38
两个不同类别名的 Multi?楼上可以讲得更清楚点吗?
5F:→ pttworld: 贴文是手误吗,回圈跑的j根本没加1啊 12/16 13:21
6F:→ pttworld: i跑到200,可是j根本没动吧 12/16 13:23
原本的CODE就有写j++,只是我复制的时候漏掉了。现在补上。
※ 编辑: lueichun (36.230.18.161), 12/16/2018 14:17:25
7F:→ AI3767: SetConnectionForMultiThread vs. SetConnections... 12/16 23:44