Тестирование потокобезопасности Java HashMapJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Гость
 Тестирование потокобезопасности Java HashMap

Сообщение Гость »


Сейчас я прохожу курс по параллельному и параллельному программированию. Мы используем Java для реализации и в настоящее время рассматриваем возможность использования JUnit 5 для выполнения тестов и демонстрации потокобезопасности определенных структур данных.

Это конкретное упражнение представляет собой введение в потокобезопасные коллекции в Java, поэтому я знаю, что существуют определенные коллекции и что тесты, которые я выполняю, могут быть ненужными при использовании правильных структур данных или решении многопоточности с помощью использование других механизмов.

Но я хотел бы воспользоваться этой возможностью, чтобы спросить отзывы как о подходе к тестированию, так и потому, что я обнаружил ошибку, которую не могу обосновать документацией.

ConcurrentIntegerSet.java:

публичный интерфейс ConcurrentIntegerSet { общедоступное логическое добавление (целочисленный элемент); публичное логическое удаление (целочисленный элемент); общественный размер int(); } класс ConcurrentIntegerSetBuggy реализует ConcurrentIntegerSet { частный окончательный набор Set; общественный ConcurrentIntegerSetBuggy () { this.set = новый HashSet(); } public boolean add(Целочисленный элемент) { вернуть set.add(элемент); } публичное логическое удаление (целочисленный элемент) { вернуть set.remove(элемент); } общественный размер int() { вернуть set.size(); } } ConcurrentSetTest.java:

публичный класс ConcurrentSetTest { частный набор ConcurrentIntegerSet; частный барьер CyclicBarrier; частный окончательный int nrThreads = 1000; @BeforeEach общественная недействительная инициализация () { // инициализирующий набор установить = новый ConcurrentIntegerSetBuggy (); // инициализирующий барьер барьер = новый CyclicBarrier (nrThreads + 1); } @RepeatedTest(10) @DisplayName("Добавить одновременно") общественное недействительное тестированиеAddConcurrent() { for (int я = 0; я { пытаться { барьер.ожидание(); // ждем, пока все потоки будут готовы // выполнение потока for (int j = 0; j < nrThreads; j++) { set.add(j); } барьер.ожидание(); // ждем, пока все потоки завершатся } catch (InterruptedException | BrokenBarrierException e) { е.printStackTrace(); } }) .начинать(); } пытаться { барьер.ожидание(); барьер.ожидание(); } catch (InterruptedException | BrokenBarrierException e) { е.printStackTrace(); } System.out.println("Установить размер: " + set.size()); Assertions.assertEquals(nrThreads, set.size()); } @RepeatedTest(10) @DisplayName("Удалить одновременно") общественное недействительное тестированиеRemoveConcurrent() { // последовательно заполняем набор значениями for (int я = 0; я
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»