Параллельная запись элементов в элемент ConcurrentHashMap допускает - PullRequest
0 голосов
/ 27 декабря 2018

Параллельная запись элементов в элемент ConcurrentHashMap допускает.Требования: написание должно быть сделано в разных потоках.Есть ли способ использовать преимущества ConcurrentHashMap и писать без блокирования и спящего режима?

Есть ли хороший код для итератора, доступ к которому осуществляется с разных ступеней.Или есть другой хороший вариант, чтобы иератяне смотрели на фактически окончательное требование?

public class Task3v2 {

public static void main(String[] args) {
    System.out.println("ConcurrentHashMap : "+timeIt(new ConcurrentHashMap<Integer, String>()));
}

static Iterator<Integer> integerIterator;

static {createIterator();}

private static void createIterator() {
    integerIterator=
    Stream.iterate(0, i -> i + 1).limit(100).collect(Collectors.toList()).iterator();
}
public static double timer(Runnable block) {
    long start = System.nanoTime();
    try {
        block.run();
    } finally {
        long end = System.nanoTime();
        return(end - start);

    }
}

public static double timeIt(Map<Integer, String> map){
    return timer(
            ()->{
        new Thread(()->{
            fillMap(map);
            System.out.println("invoked");
            readMap(map);
        }).start();
    });
}

private static void fillMap(Map<Integer, String> map){
    int[] index = new int[1];
    String[] tmp = new String[1];
    try {
        Thread.sleep(100);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    for(int i = 0; i< 100; i++){
        index[0] = i;
        tmp[0] = "Name"+i;
        new Thread(()->{
            int a = integerIterator.next();
            System.out.println("a :"+a);
            map.put(a,"Name"+a);
        }
        ).start();
    }
}

private static void readMap(Map<Integer, String> map){
    int[] index2 = new int[1];
    for(int i = 0; i< 100; i++){
        index2[0]=i;
        try {
            Thread.sleep(200);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        new Thread(()->{
            System.out.println("map.get(index2[0]) :"+map.get(index2[0]));
        }).start();
    }
}

}

Наконец карта должна пройти следующие тесты:

public class Task3Test {

static ConcurrentHashMap<Integer, String> map;

@BeforeClass
public static void fillMap(){
    map = new ConcurrentHashMap<>();
    timeIt(map);
}


@Test
public void elementPresenceTest(){
    //GIVEN
    //map;

    //WHEN
    List<Integer> actualPresenceList = Stream.iterate(0, i -> i + 1).limit(100)
            .filter(n->(map.entrySet().stream().map(Map.Entry::getKey)
                    .anyMatch(m->(n.equals(m))))).collect(Collectors.toList());
    actualPresenceList.forEach(System.out::println);
    System.out.println("size"+actualPresenceList.size());

    //THEN
    List<Integer>expectedPresenceList = Stream.iterate(0, i -> i + 1).limit(100).collect(Collectors.toList());
    assertThat(actualPresenceList, Matchers.contains(expectedPresenceList));
}

@Test
public void elementAmountTest() {
    assertThat(map.entrySet(), Matchers.hasSize(100));
}

}

1 Ответ

0 голосов
/ 27 декабря 2018

Итератор недопустим для параллелизма.Решение: статическая очередьспать для метода readMap (), чтобы обеспечить время для метода записи.Если необходимо сохранить какую-либо структуру данных при добавлении новых элементов в среде параллелизма, вместо карты следует использовать очередь.

...