Распространенные ошибки в простых многопоточных программах

Университетом Вашингтона было проведено исследование распространенных ошибок в простых многопоточных программах. Обнаруженные ошибки были разделены на 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
    }
}
Другие вопросы по тегам