Я синхронизирую код ниже, но это приводит к проблемам параллелизма.Почему этот метод приводит к проблемам параллелизма?
Я знаю, что это вызвано многопоточным, меня смутило ключевое слово synchronized
. Я ожидал, что значение list.length
равно 100. Как я могу его исправить?
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class ThreadA extends Thread {
private static byte[] lock = new byte[0];
private static final List<String> list = new ArrayList<String>();
@Override
public void run() {
System.out.println(list.size());
synchronized(lock) {
int size = list.size();
if(size == 0) return;
if(size >= 100) {
list.clear();
}
}
}
public void add(String s) {
list.add(s);
}
public static void main(String[] args) {
for(int i = 0; i < 100; i++) {
new ThreadA().start();
new Thread(new Runnable() {
@Override
public void run() {
synchronized(lock) {
for(int m = 0; m < 100; m++) {
list.add(new Date().toLocaleString());
}
}
}
}).start();
}
System.out.println("LIST.SIZE:" + list.size());
}
}
Это ваша домашняя работа на сегодня? –
Попробуйте добавить эту строку прямо перед окончательной печатью LIST.SIZE: Thread.sleep (4000); Это должно по крайней мере дать вам понять, что происходит неправильно. –
Почему вы ожидали, что размер будет равен 100, а не 0? –