Поскольку b()
не синхронизирован, а a()
- это возможно, один поток может находиться в a()
, а другой - в b()
. Таким образом, значение x
наиболее вероятно будет искажено из-за параллельного несинхронизированного доступа к x
.
Кроме того, если ваш код был таким:
class Test{
double x;
public void synchronized a()
{
x = 0;
//do some more stuff
}
public void b()
{
x = -1;
a(); //added call to a()
}
}
и оба ваших потока работают на том же экземпляре , тогда возникает вероятность того, что поток 1 [в настоящее время в a()
вытесняется потоком 2 [в настоящее время в b()
].
Однако после прерывания потока 1, когда поток 2 пытается ввести метод a()
, JVM не разрешит его; поскольку другой поток [хотя и не запущенный] уже имеет блокировку. Следовательно, теперь поток 2 будет вынужден ждать, пока поток 1 завершит выполнение a()
и вернется. Тогда поток 2 [скорее всего] будет возвращен к жизни и разрешен к исполнению a()
.