Dúvida com construção de synchronized?

Quais são as diferenças destes itens?

public metodo(Object a) { synchronized(a) { int x = 0; System.out.println(++x); } }

para isso:

public metodo(Object a) { synchronized(this) { int x = 0; System.out.println(++x); } }

para isso:

synchronized public metodo(Object a) { int x = 0; System.out.println(++x); }

A thread que chamar metodo() vai bloquear :
1- o objeto a.
2- o objeto this (que é da classe que declara metodo())
3- igual a 2, mas não tenho certeza absoluta…

como assim bloquear o objeto???

Para outra thread não acessá-lo.