Распространенные ошибки в простых многопоточных программах
Университетом Вашингтона было проведено исследование распространенных ошибок в простых многопоточных программах. Обнаруженные ошибки были разделены на 3 категории: гонки данных, тупик и разное.
В категории Разное произошла ошибка, я не понимаю:
Ненужное использование отключения прерывания и блокировки захвата и выпуска
Что означает отключение прерываний, блокировку и снятие блокировки?
Почему это не должно использоваться вместе?
Может ли кто-нибудь объяснить это?
1 ответ
Ненужное использование отключения прерывания
public void run(){
while(true){
//some deep logic
try{
Thread.sleep(5000);
}catch(InterruptedException){
//eating away the exception without taking any steps
}
}
}
Таким образом, теперь поток, выполняющий эту логику, не может быть прерван, поскольку он поглощает исключения, поэтому он называется отключением прерываний, и единственный способ остановить это - уничтожить программу, что очень плохо, поскольку она может оставить структуры данных в неправильном состоянии.
Ненужное использование захвата и освобождения замка
class Test{
private int counter = 0;
public synchronized void increment(){ counter++; }
public synchronized void decrement(){ counter--;}
//Unnecessary placement of synchronized block here
public synchronized void printString(){
//this method does not use counter so no need to use synchronized block
}
}