Ich führe den folgenden Code mehrere Male und festgestellt, dass irgendwann bekomme ich "null" von ArrayList. Ich bin nicht in der Lage zu verstehen, warum dies bei mir passiert, während ich Integer-Wert zum Array hinzufüge.Warum bekomme ich Null-Wert von ArrayList nach dem Hinzufügen von Wert mit Thread
package com;
import java.util.ArrayList;
import java.util.List;
public class test implements Runnable {
static List<Integer> ls = new ArrayList<Integer>();
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(new test());
Thread t2 = new Thread(new test());
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println(ls.size());
for (int i = 0; i < ls.size(); ++i) {
System.out.println(i + " " + ls.get(i));
}
}
@Override
public synchronized void run() {
try {
for (int i = 0; i < 20; ++i) {
ls.add(i);
Thread.sleep(5);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Ausgabe:
36
0 0
1 0
2 1
3 1
4 2
5 2
6 3
7 3
8 4
9 4
**10 null**
11 5
12 6
13 6
14 7
15 7
16 8
17 8
18 9
19 9
20 10
21 10
22 11
23 11
24 12
25 12
26 13
27 14
28 15
29 16
30 16
31 17
32 17
33 18
34 19
35 19
Ich weiß das, warum die Gesamtgröße 36. Aber ich möchte wissen, warum ich an der 10. Position null bekam.
HINWEIS: Dies wird nicht jedes Mal generiert. Sie müssen diesen Code möglicherweise 5 bis 10 Mal ausführen, um dies zu generieren.
Wissen Sie, wie 'ArrayList' die Größe intern ändert? Verwenden Sie keine Thread-unsicheren Objekte über Threads hinweg. – Savior
"Verwenden Sie einfach keine unsicheren Threads für Threads." Es ist nicht relevant. @Pillar –
Bitte schauen Sie in die Semantik von 'synchronized'. Du benutzt es falsch. 'run()' Methode ist fast nie 'synchronisiert'. – Arkadiy