Есть ли способ узнать все возможные места в коде, где система может обмениваться потоками - PullRequest
0 голосов
/ 01 октября 2018

Я читаю книгу под названием «Параллелизм Java на практике», и в первой главе следующий код демонстрируется как небезопасный поток

public class UnsafeSequence {
   private int value;

   /** Returns a unique value. */
   public int getNext() {
      return value++;
   }
}

Так что, если два потока запускают этот код, мы можем получить нежелательные результатыпотому что они будут меняться на разных этапах, таких как чтение, изменение и запись значения.Это определяется только ОС, или потоки переключаются между собой, например, по разным «командам байт-кода»?Есть ли способ узнать все возможные места, где потоки могут переключаться с одного на другой, не только для этого кода, но и вообще?

Ответы [ 3 ]

0 голосов
/ 01 октября 2018

Есть ли способ узнать все возможные места, где потоки могут переключаться с одного на другой, не только для этого кода, но и вообще?

Этот вопрос немного неясен.Позвольте мне разделить его на две части:

  1. Два потока могут бродить по одному и тому же коду и успешно чередоваться, за исключением:

    • внутри атомарных операций (включая сложные операции внутри потоковых классов)
    • внутри охраняемых блоков (например, с использованием синхронизированного блока, блокировки, семафора или какого-либо другого ограничителя памяти)
  2. Потоки могут переключаться все время, что на 100% зависит от ОС.Теоретически поток может даже никогда не получить шанс снова «запланироваться», если ОС решит так.Потоки могут внезапно умереть (например, уничтожены в ProcessExplorer).Вы никогда не знаете, когда поток будет остановлен в его дорожках (приостановлено), но вы знаете, что если это происходит внутри атомарной операции, никакой другой поток не будет вводить этот код, пока приостановленный поток не возобновит и не завершит операцию.

0 голосов
/ 02 октября 2018

Это происходит всякий раз, когда системный планировщик чувствует себя как.Это не имеет ничего общего с JVM, если JVM передает это планирование только на собственный процессор.

0 голосов
/ 01 октября 2018

Как отмечают несколько комментариев, нет.Вы можете сделать две вещи:

Писать свои классы потокобезопасным способом, чтобы планирование потоков не было проблемой.

Используйте поддержку параллелизма для предотвращения проблем.

Продолжайте читать книгу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...