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
В Java синхронизированные блокировки являются реентерабельными .
Вспомните, что нить не может получить блокировку, принадлежащую другому потоку. Но нить может приобрести блокировку, которой она уже владеет. Разрешить потоку получать один и тот же замок более одного раза, обеспечивает повторную синхронизацию. Это описывает ситуацию, когда синхронизированный код, прямо или косвенно, вызывает метод, который также содержит синхронизированный код, и оба набора кода используют одну и ту же блокировку. Без повторной синхронизации синхронизированный код должен принять много дополнительных мер предосторожности, чтобы избежать блокировки потока.
blockquote>Источник: см. нижнюю часть на этой странице
Синхронизированный метод должен иметь возможность получить блокировку объекта монитора. Объектом монитора является экземпляр (или класс для статического метода). Нить, которая уже имеет блокировку, не нуждается в ее повторении. Так что да, это может вызвать stackoverflow (harhar).
из java tutorials :
Когда один поток выполняет синхронизированный метод для объекта, все остальные потоки, которые вызывают синхронизированные методы для одного и того же блока объектов ( приостановить выполнение) до тех пор, пока первый поток не будет выполнен с объектом.
blockquote>Итак, я думаю, что ключевое слово syncronized работало, как ожидалось, и синхронизированный рекурсивный вызов совершенно легален (и работает) в java.