Являются ли вызовы Java-методов нативными? - PullRequest
3 голосов
/ 22 августа 2011

Мне нужна определенная операция, чтобы быть атомарной.

Здесь «атомарный» означает сказать: «как только этот метод начал выполнение, его не следует прерывать до его завершения, и даже планировщик потока также не должен переводить этот поток в состояние Runnable после его перехода в состояние Running».

Все методы являются нативными, и для их выполнения одновременно работают несколько потоков.

Первый вопрос. Является ли выполнение собственных методов атомарным по своей природе?

Второй вопрос: Чтобы достичь атомарности, можем ли мы использовать API java concurent / lock, если да, пожалуйста, предоставьте любой пример / ссылку, если это возможно?

Спасибо.

Ответы [ 3 ]

2 голосов
/ 22 августа 2011

Если я правильно понял вопрос, вы спрашиваете: могу ли я добиться того, чтобы определенный поток всегда работал на ЦП до его завершения? Чтобы было ясно, он не должен быть заменен другим потоком в течение этого времени.

Ответ: даже если бы это было (а я так не думаю), это не имело бы никакого отношения к атомарности. Потому что, если у вас есть несколько ЦП, несколько потоков могут по-прежнему обращаться к одним и тем же данным и изменять их, в то время как все они работают без прерываний одновременно. Следовательно, даже с вашим определением «атомарности» вы все равно столкнетесь с проблемами параллелизма.

Если вы просто хотите обеспечить безопасность потоков в обычном смысле, тогда да, вы можете использовать java-блокировки и т. Д. Для достижения этого, даже если вы вызываете нативные методы. см. http://journals.ecs.soton.ac.uk/java/tutorial/native1.1/implementing/sync.html для примера синхронизации потока Java из собственных методов.

1 голос
/ 22 августа 2011

Чтобы предотвратить прерывание, необходимо выполнить инструкции машинного кода, чтобы отключить и разрешить прерывания (на x86 / x64). Это не то, что вы можете даже сделать на простом языке Си.

Это такой низкий уровень, как это редко делается. Во многом потому, что это редко очень полезно. Основная проблема, как правило, заключается в поведении взаимодействия с другими потоками, поэтому Atomic определяется таким образом для большинства случаев использования, а не atomic в терминах прерываний.

0 голосов
/ 22 августа 2011

Ваше определение атома нестандартно. Это более стандартное определение .

  1. Являются ли нативные методы атомарными (по вашему нестандартному определению)? Поскольку я мог в любой момент во время работы нативного метода выдернуть шнур питания и выполнить прерывание, я бы сказал, что нативные методы неисправимо не атомарны.
  2. Можем ли мы использовать API одновременной блокировки Java для достижения атомарности (нестандартности) в нативных методах? Как указывалось ранее, нативные методы неисправимо не атомарны. Ничто не может помочь.
...