2

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

Мне очень интересно узнать, является ли:

  • всех синхронизированных методов в Java критических областях?

  • являются критическими областями, встречающимися только в параллельных системах на Java?

+1

"Являются ли критические области можно найти только в параллельных системах в Java?" - Как бы вы ** определили ** «критический регион»? Если система не является «параллельной» - как система может соответствовать этому определению? – Fildor

+0

Критический раздел - это то, что вы его определяете. Вы можете иметь критические разделы, которые имеют решающее значение с точки зрения производительности, а не с точки зрения безопасности потоков. –

+0

Вы не обнаружили их. Вы * проектируете * их. Неясно, что вы спрашиваете. – EJP

ответ

0

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

2

В параллельности Critical Section просто фрагмент кода, где один поток может записывать/считывать в/из памяти, когда какой-либо другой пишет в той же памяти или один поток собирается для записи в память, когда какой-либо другой поток считывается из одной и той же памяти.

Резюме

  • Резьба1 - написать | Thread2 - написать | Безопасность - No

  • Thread1 - писать | Thread2 - читать | Плотность - No

  • Thread1 - читать | Thread2 - написать | Плотность - No

  • Thread1 - читать | Thread2 - читать | Безопасность - Да

т.е. они секция в нашей программе, где это может вызвать возможные ошибки/неисправности, если мы не будем осуществлять надлежащее control над ним. (Например: замки, семафоры, барьеры и т. Д.)

И он применим не только для Java. Он применяется к любому языку программирования, который поддерживает потоки.

+1

+1, я не знал, что это официальный термин в согласном программировании: https://en.wikipedia.org/wiki/Critical_section (даже если это раздел, а не регион, как сказал OP). Что касается второго вопроса, я не уверен, что вопрос касался именно Java, но более похоже на: «являются ли критичные регионы только в параллельных системах?», Но ответ, очевидно, будет да, так как этот термин касается только программирования parrallel. – Asoub

+0

@Asoub да. Слово «критическое» может иметь разные интерпретации в соответствии с используемым контекстом. Я просто заявил, что это означает в контексте параллельного программирования. :)) И thnx для вашего источника, я добавил это к моему ответу. :)) –

2

все синхронизированные методы в критических областях Java?

Не только synchronized методы/блоки, код с помощью Lock API слишком защитить критическую область (раздел)

Несколько способов охраняя критической секции.

1.синхронизированные методы:

public synchronized void incrementCounter(){ 
    ++counter; 
} 

2. синхронные заявления

public int getCounter(){ 
    synchronized(this){ 
     return counter; 
    } 
} 

3. Замок API

class X { 
    private final ReentrantLock lock = new ReentrantLock(); 
    // ... 

    public void m() { 
    lock.lock(); // block until condition holds 
    try { 
     // ... method body, which is critical section 
    } finally { 
     lock.unlock() 
    } 
    } 
} 

Полезные SE вопросы:

Why use a ReentrantLock if one can use synchronized(this)?

Avoid synchronized(this) in Java?

являются критические области можно найти только в параллельных системах в Java?

№ Они также могут быть найдены на других языках.

Связанные SE вопрос:

C# version of java's synchronized keyword?

Does PHP have the equivilant to Java 'synchronized' , or is this not required?

Смежные вопросы