Обычно в Java, когда ожидается, что параллелизм будет проблемой, ключевое слово synchronized
будет использоваться в методах, которые изменяют или считывают внутреннее состояние объекта, или блок synchronized
будет использоваться с блокировкой не Нулевой объект. И то и другое потребует создания методов доступа для установки значений val1 и val2.
Пример использования синхронизированных методов, которые изменяют (или читают) внутреннее состояние:
class ThreadSafe
{
private static int val1;
private static int val2;
static synchronized void go()
{
if (val2 != 0)
{
System.out.println(val1 / val2);
}
val2 = 0;
}
static synchronized void setVal1(int newVal1)
{
val1 = newVal1;
}
static synchronized void setVal2(int newVal2)
{
val2 = newVal2;
}
}
В этом случае, поскольку методы являются статическими, синхронизация будет происходить в самом классе.
Пример использования синхронизации с ненулевым объектом:
class ThreadSafe
{
private static int val1;
private static int val2;
private static Object lock = new Object();
static void go()
{
synchronized (lock)
{
if (val2 != 0)
{
System.out.println(val1 / val2);
}
val2 = 0;
}
}
static void setVal1(int newVal1)
{
synchronized (lock)
{
val1 = newVal1;
}
}
static synchronized void setVal2(int newVal2)
{
synchronized (lock)
{
val2 = newVal2;
}
}
}
См. Также Что означает «синхронизированный»?