JArmus - библиотека для обнаружения и устранения тупиков. Включает поддержку:
Thread.join
, CyclicBarrier
, CountDownLatch
, Phaser
и
ReentrantLock
.
Чтобы использовать JArmus, вам нужно использовать свой код. Либо через один из его инструментированных классов, либо автоматически с помощью инструментария JArmus jarmusc
.
java -jar jarmusc.jar yourprogram.jar checkedprogram.jar
Ввод yourprogram.jar
- это программа, которую вы хотите проверить.
Вывод - та же самая программа с проверками, чтобы автоматически найти любой тупик.
Барьерам нужна помощь
Проверка взаимоблокировок с помощью классов CyclicBarrier
, CountDownLatch
, Phaser
немного сложнее - например, JConsole не может обнаружить взаимоблокировки этих типов. JArmus нуждается в небольшой помощи от вас: вы должны указать, какие потоки влияют на синхронизацию, мы называем эти зарегистрированные потоки.
Как можно скорее поток должен пометить себя как зарегистрированного. Хорошее место для пометки зарегистрированных тем - метод начала Runnable.run
.
JArmus.register(latch);
Пример * * 1 032
Следующая программа, которая блокируется правильно, определяется
JArmus:
final CountDownLatch latch = new CountDownLatch(2);
final CyclicBarrier barrier = new CyclicBarrier(2);
final Queue<Exception> exceptions = new ArrayDeque<>();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
try {
JArmus.register(barrier); // do not forget to register!
JArmus.register(latch); // do not forget to register!
latch.countDown();
latch.await();
barrier.await();
} catch (Exception e) {
exceptions.add(e);
}
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
try {
JArmus.register(barrier); // do not forget to register!
JArmus.register(latch); // do not forget to register!
barrier.await();
latch.countDown();
latch.await();
} catch (Exception e) {
exceptions.add(e);
}
}
});
t1.start();
t2.start();