Нет, это не совсем правильно.Vector
синхронизируется на самом экземпляре Vector
, тогда как синхронизированный блок фактически синхронизируется на экземпляре, который содержит Vector
.Два метода, входящие в синхронизированный блок, должны сначала получить монитор, связанный с this
, а затем получить монитор, связанный с экземпляром Vector
.
В крайнем случае, если один из потоков содержитконтролировать, что требуется другому (если у вас есть и другие синхронизированные блоки), тогда вы можете зайти в тупик.
Тем не менее, учитывая только часть размещенного кода, поток, который первым получает монитор на this
будет первым, кто выполнит операцию над вектором.Кроме того, последовательности операций на экземпляре Vector
могут выполняться первым потоком без какого-либо чередования операций вторым потоком;это необходимо, если вы хотите выполнить атомарную последовательность операций на экземпляре Vector
, что не будет иметь место на обычном синхронизированном экземпляре Vector
.Чтобы представить это в псевдокоде, последовательность операций в двух представленных ниже случаях будет отличаться, если произойдет переключение контекста между двумя или более потоками, выполняющими один и тот же блок:
Случай A
synchronized
{
vector.add(a);
vector.add(b);
/*
* a and b are always added to the vector in sequence.
* If two threads execute this block, the vector will contain {a,b,a,b}.
*/
}
Корпус B
{
vector.add(a);
vector.add(b);
/*
* a and b need not be added to the vector in sequence.
* If two threads execute this block, the vector will contain one of {a,b,a,b}, {a,a,b,b}....
*/
}