diff --git a/core-java/src/test/java/com/baeldung/concurrent/copyonwrite/CopyOnWriteArrayListTest.java b/core-java/src/test/java/com/baeldung/concurrent/copyonwrite/CopyOnWriteArrayListTest.java new file mode 100644 index 0000000000..c71c193372 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/concurrent/copyonwrite/CopyOnWriteArrayListTest.java @@ -0,0 +1,53 @@ +package com.baeldung.concurrent.copyonwrite; + + +import org.junit.Test; + +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; + +import static org.assertj.core.api.Assertions.assertThat; + + +public class CopyOnWriteArrayListTest { + + @Test + public void givenCopyOnWriteList_whenIterateAndAddElementToUnderneathList_thenShouldNotChangeIterator() { + //given + final CopyOnWriteArrayList numbers = + new CopyOnWriteArrayList<>(new Integer[]{1, 3, 5, 8}); + + //when + Iterator iterator = numbers.iterator(); + numbers.add(10); + + //then + List result = new LinkedList<>(); + iterator.forEachRemaining(result::add); + assertThat(result).containsOnly(1, 3, 5, 8); + + //and + Iterator iterator2 = numbers.iterator(); + List result2 = new LinkedList<>(); + iterator2.forEachRemaining(result2::add); + + //then + assertThat(result2).containsOnly(1, 3, 5, 8, 10); + + } + + @Test(expected = UnsupportedOperationException.class) + public void givenCopyOnWriteList_whenIterateOverItAndTryToRemoveElement_thenShouldThrowException() { + //given + final CopyOnWriteArrayList numbers = + new CopyOnWriteArrayList<>(new Integer[]{1, 3, 5, 8}); + + //when + Iterator iterator = numbers.iterator(); + while (iterator.hasNext()) { + iterator.remove(); + } + } +}