У меня есть метод, который должен подавать карту из очереди, и это только делает это, если размер карты не превышает определенного числа. Это вызвало проблему параллелизма, поскольку размер, который я получаю из каждого потока, является несовместимым глобальным. Я копировал проблему этого кодомМножество потоков, определяющих размер и плотность карты.
import java.sql.Timestamp;
import java.util.Date;
import java.util.concurrent.ConcurrentHashMap;
public class ConcurrenthashMapTest {
private ConcurrentHashMap<Integer, Integer> map = new ConcurrentHashMap<Integer, Integer>();
private ThreadUx[] tArray = new ThreadUx[999];
public void parallelMapFilling() {
for (int i = 0; i < 999; i++) {
tArray[i] = new ThreadUx(i);
}
for (int i = 0; i < 999; i++) {
tArray[i].start();
}
}
public class ThreadUx extends Thread {
private int seq = 0;
public ThreadUx(int i) {
seq = i;
}
@Override
public void run() {
while (map.size() < 2) {
map.put(seq, seq);
System.out.println(Thread.currentThread().getName() + " || The size is: " + map.size() + " || " + new Timestamp(new Date().getTime()));
}
}
}
public static void main(String[] args) {
new ConcurrenthashMapTest().parallelMapFilling();
}
}
Обычно я должен иметь только одну строку вывода и размера, не превышающий 1, но у меня есть некоторые вещи, как этот
Thread-1 || The size is: 2 || 2016-06-07 18:32:55.157
Thread-0 || The size is: 2 || 2016-06-07 18:32:55.157
Я попытался маркировками всего запустить метод как синхронизированный, но это не сработало, только тогда, когда я сделал это
@Override
public void run() {
synchronized (map) {
if (map.size() < 1) {
map.put(seq, seq);
System.out.println(Thread.currentThread().getName() + " || The size is: " + map.size() + " || " + new Timestamp(new Date().getTime()));
}
}
}
Он работал, почему только блок синхронизации рабочего и синхронизирующий метод? Также я не хочу использовать что-то столь же старое, как блок синхронизации, поскольку я работаю над Java EE-приложением, есть ли исполнитель задачи Spring или Java EE или аннотация, которые могут помочь?
Я не понимаю, что старое с синхронизированным? –
ConcurrentHashMap не может дать строго согласованный размер, потому что он действительно не знает размер. Нет ничего плохого в синхронизации, просто прекратите читать эти блоги :) –