Как будет выполнено выполнение, если мы используем рекурсию для синхронизированного метода в Java? [Дубликат]

Отсутствует «extern» в объявлениях / определениях переменной const (только для C ++)

Для людей, прибывающих с C, может показаться неожиданным, что в C ++ глобальные переменные const имеют внутренние (или статические) связь. В C это не так, поскольку все глобальные переменные неявно extern (т.е. когда отсутствует ключевое слово static).

Пример:

// file1.cpp
const int test = 5;    // in C++ same as "static const int test = 5"
int test2 = 5;

// file2.cpp
extern const int test;
extern int test2;

void foo()
{
 int x = test;   // linker error in C++ , no error in C
 int y = test2;  // no problem
}

correct would использовать файл заголовка и включить его в file2.cpp и file1.cpp

extern const int test;
extern int test2;

. В качестве альтернативы можно было бы объявить переменную const в файле file1.cpp с явным extern

23
задан vaxquis 23 January 2014 в 07:11
поделиться

3 ответа

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

Вспомните, что нить не может получить блокировку, принадлежащую другому потоку. Но нить может приобрести блокировку, которой она уже владеет. Разрешить потоку получать один и тот же замок более одного раза, обеспечивает повторную синхронизацию. Это описывает ситуацию, когда синхронизированный код, прямо или косвенно, вызывает метод, который также содержит синхронизированный код, и оба набора кода используют одну и ту же блокировку. Без повторной синхронизации синхронизированный код должен принять много дополнительных мер предосторожности, чтобы избежать блокировки потока.

Источник: см. нижнюю часть на этой странице

65
ответ дан Duncan Jones 1 September 2018 в 00:13
поделиться

Синхронизированный метод должен иметь возможность получить блокировку объекта монитора. Объектом монитора является экземпляр (или класс для статического метода). Нить, которая уже имеет блокировку, не нуждается в ее повторении. Так что да, это может вызвать stackoverflow (harhar).

2
ответ дан akaIDIOT 1 September 2018 в 00:13
поделиться

из java tutorials :

Когда один поток выполняет синхронизированный метод для объекта, все остальные потоки, которые вызывают синхронизированные методы для одного и того же блока объектов ( приостановить выполнение) до тех пор, пока первый поток не будет выполнен с объектом.

Итак, я думаю, что ключевое слово syncronized работало, как ожидалось, и синхронизированный рекурсивный вызов совершенно легален (и работает) в java.

2
ответ дан Luca Putzu 1 September 2018 в 00:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: