Reason java.util.concurrent.BrokenBarrierException

I study the cyclic barrier.

I am trying to write sample code:

public class Main { public static final int PARSER_COUNT = 15; public static final int PRODUCT_TRESHOLD = 5; public static void main(String args[]) { ProductImporter productImporter = new ProductImporter(PRODUCT_TRESHOLD); for (int i = 0; i < PARSER_COUNT; i++) { new Thread(new ProductParser(productImporter, "Parser" + (i + 1))).start(); } } } class ProductImporter { private CyclicBarrier barrier; private List<String> parsedProducts; public ProductImporter(int productTreshold) { parsedProducts = new ArrayList<String>(); barrier = new CyclicBarrier(productTreshold, new Runnable() { @Override public void run() { System.out.println("start import " + parsedProducts); parsedProducts.clear(); } }); } public void recharge(String name) { try { parsedProducts.add(name); /*System.out.println("Added product to importList#"+parsedProducts.size());*/ barrier.await(); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } } } class ProductParser implements Runnable { private String name; private Random rand; private ProductImporter productImporter; private int counter = 0; public ProductParser(ProductImporter productImporter, String name) { this.name = name; this.productImporter = productImporter; this.rand = new Random(); } public void run() { try { while (true) { Thread.sleep(rand.nextInt(12)); System.out.println(name + " parsed product#" + counter); productImporter.recharge(name + "#" + (counter++)); } } catch (InterruptedException e) { e.printStackTrace(); } } } 

But I get java.util.concurrent.BrokenBarrierException

Please help me understand that I'm wrong

PS

Sometimes in the output I see foollowing lines:

 start import [Parser7, Parser4, Parser9, Parser10, Parser2, Parser13, Parser6] 

Expected Result - An Array with 5 Elements

PPS

output sample:

 start import [Parser13#21, Parser15#28, Parser12#22, Parser6#19, Parser8#27] Parser9 parsed product#23 Parser1 parsed product#19 Parser15 parsed product#29 Parser14 parsed product#23 Parser11 parsed product#22 start import [Parser9#23, Parser1#19, Parser15#29, Parser14#23, Parser11#22] Parser12 parsed product#23 Parser8 parsed product#28 Parser4 parsed product#25 Parser13 parsed product#22 Parser5 parsed product#23 start import [Parser12#23, Parser8#28, Parser4#25, Parser13#22, Parser5#23] Parser7 parsed product#23 Parser3 parsed product#26 Parser6 parsed product#20 Parser14 parsed product#24 Parser10 parsed product#25 start import [Parser7#23, Parser3#26, Parser6#20, Parser14#24, Parser10#25] Parser2 parsed product#24 Parser4 parsed product#26 Parser8 parsed product#29 Parser1 parsed product#20 Parser5 parsed product#24 Parser13 parsed product#23 start import [Parser2#24, Parser4#26, Parser8#29, Parser1#20, Parser5#24] Parser5 parsed product#25 Parser9 parsed product#24 Parser11 parsed product#23 Parser7 parsed product#24 start import [Parser5#25, Parser9#24, Parser11#23, Parser7#24] Parser10 parsed product#26 Parser3 parsed product#27 Parser1 parsed product#21 Parser13 parsed product#24 Parser7 parsed product#25 start import [Parser10#26, Parser3#27, Parser1#21, Parser13#24, Parser7#25] Parser2 parsed product#25 Parser10 parsed product#27 Parser7 parsed product#26 Parser15 parsed product#30 Parser12 parsed product#24 start import [Parser2#25, Parser10#27, Parser7#26, Parser15#30, Parser12#24] Parser6 parsed product#21 Parser14 parsed product#25 Parser11 parsed product#24 Parser5 parsed product#26 Parser13 parsed product#25 Parser1 parsed product#22 Parser4 parsed product#27 Parser11 parsed product#25 Parser11 parsed product#26 Exception in thread "Thread-12" java.util.concurrent.BrokenBarrierException at java.util.concurrent.CyclicBarrier.dowait(CyclicBarrier.java:207) at java.util.concurrent.CyclicBarrier.await(CyclicBarrier.java:362) at lection2.task3.ProductImporter.recharge(Main.java:46) at lection2.task3.ProductParser.run(Main.java:74) at java.lang.Thread.run(Thread.java:745) java.util.concurrent.BrokenBarrierException at java.util.concurrent.CyclicBarrier.dowait(CyclicBarrier.java:250) at java.util.concurrent.CyclicBarrier.await(CyclicBarrier.java:362) at lection2.task3.ProductImporter.recharge(Main.java:46) at lection2.task3.ProductParser.run(Main.java:74) at java.lang.Thread.run(Thread.java:745) java.util.concurrent.BrokenBarrierException at java.util.concurrent.CyclicBarrier.dowait(CyclicBarrier.java:250) at java.util.concurrent.CyclicBarrier.await(CyclicBarrier.java:362) at lection2.task3.ProductImporter.recharge(Main.java:46) at lection2.task3.ProductParser.run(Main.java:74) at java.lang.Thread.run(Thread.java:745) java.util.concurrent.BrokenBarrierException at java.util.concurrent.CyclicBarrier.dowait(CyclicBarrier.java:207) at java.util.concurrent.CyclicBarrier.await(CyclicBarrier.java:362) at lection2.task3.ProductImporter.recharge(Main.java:46) at lection2.task3.ProductParser.run(Main.java:74) at java.lang.Thread.run(Thread.java:745) java.util.concurrent.BrokenBarrierException at java.util.concurrent.CyclicBarrier.dowait(CyclicBarrier.java:207) at java.util.concurrent.CyclicBarrier.await(CyclicBarrier.java:362) at lection2.task3.ProductImporter.recharge(Main.java:46) at lection2.task3.ProductParser.run(Main.java:74) at java.lang.Thread.run(Thread.java:745) java.util.concurrent.BrokenBarrierException at java.util.concurrent.CyclicBarrier.dowait(CyclicBarrier.java:250) at java.util.concurrent.CyclicBarrier.await(CyclicBarrier.java:362) at lection2.task3.ProductImporter.recharge(Main.java:46) at lection2.task3.ProductParser.run(Main.java:74) at java.lang.Thread.run(Thread.java:745) java.util.concurrent.BrokenBarrierException at java.util.concurrent.CyclicBarrier.dowait(CyclicBarrier.java:250) at java.util.concurrent.CyclicBarrier.await(CyclicBarrier.java:362) at lection2.task3.ProductImporter.recharge(Main.java:46) at lection2.task3.ProductParser.run(Main.java:74) at java.lang.Thread.run(Thread.java:745) java.util.concurrent.BrokenBarrierException at java.util.concurrent.CyclicBarrier.dowait(CyclicBarrier.java:207) at java.util.concurrent.CyclicBarrier.await(CyclicBarrier.java:362) at lection2.task3.ProductImporter.recharge(Main.java:46) at lection2.task3.ProductParser.run(Main.java:74) at java.lang.Thread.run(Thread.java:745) 

PPPS

If you make the sleep interval much better, it works well.

+5
source share
2 answers

You are throwing action throws ConcurrentModificationException

Because ArrayList not a proper container. The guard joins it with a synchronized block or uses a container with streams, for example Vector .

PS: you get more than 5 elements in your ArrayList , because nothing protects it from changing.

+2
source

Looking at the docs of the constructor of CyclicBarrier , he says that:

Creates a new CyclicBarrier, which will be disabled when a specified number of sides (flows) are waiting for it, and which will perform this action of the barrier when the barrier is triggered by executing the last thread entering the barrier.

Thus, it is likely that there is a race condition between your ProductImporter.recharge action and the barrier, where the former is trying to add parsedProducts to your list, and the latter is trying to clear it. Two simple fixes:

Finally, just a general note about your codes: it doesn't seem right for main() to create multiple worker threads for sharing an instance, and this shared instance puts a barrier on threads. I suppose I'm more used to seeing how the action of the barrier and the barrier is introduced and imposed by the parent thread in all its child threads, as an example in the Java doc .

0
source

All Articles