Тестирование потокобезопасности Java HashMap ⇐ 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; я
Сейчас я прохожу курс по параллельному и параллельному программированию. Мы используем 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; я
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение