Ну, знаете ли вы разницу между статическим методом и методом экземпляра в целом?
Единственное отличие, которое имеет synchronized
, состоит в том, что перед тем, как виртуальная машина начнет запускать этот метод, она должна получить монитор. Для метода экземпляра получена блокировка, связанная с объектом, для которого вы вызываете метод. Для статического метода полученная блокировка связана с самим типом, поэтому никакие другие потоки не смогут одновременно вызывать любые другие синхронизированные статические методы.
Другими словами, это:
class Test
{
static synchronized void Foo() { ... }
synchronized void Bar() { ... }
}
равно примерно эквивалентно:
class Test
{
static void Foo()
{
synchronized(Test.class)
{
...
}
}
void Bar()
{
synchronized(this)
{
...
}
}
}
Обычно я вообще не использую синхронизированные методы - я предпочитаю явно синхронизировать ссылку на частную блокировку:
private final Object lock = new Object();
...
void Bar()
{
synchronized(lock)
{
...
}
}
Вы не предоставили достаточно информации, чтобы определить, должен ли ваш метод быть статическим или методом экземпляра, или он должен быть синхронизирован вообще. Многопоточность - сложная проблема - я настоятельно рекомендую вам прочитать об этом (через книги, учебные пособия и т. Д.).