Exemplo

público sincronizado int getNumber() {
tentar { Thread.sleep( 3000 ); } capturar (InterruptedException e) {}
retornar número;
}

público sincronizado Cadeia getString() {
retornar str;
}

privado Cadeia str = "Olá, Mundo!"; //$NON-NLS-1$
privado int número = 10;

público estático nulo principal( Cadeia[] args ) {
final SynchronizedMethod_Example dados = novo SynchronizedMethod_Example();
Executável numberReader = novo Executável() {
público nulo executar() {
System.out.println( "Obtendo número..." ); //$NON-NLS-1$
System.out.println( data.getNumber() );
}
};
Executável stringReader = novo Executável() {
público nulo executar() {
System.out.println( "Obtendo cadeia..." ); //$NON-NLS-1$
System.out.println( data.getString() );
}
};

(novo Cadeia( numberReader ) ).start();
(novo Cadeia( stringReader ) ).start();
}

Solução
Crie o bloco sincronizado no método que só bloqueia as instruções necessárias.

público int getNumber() {
sincronizado ( numberLock ) {
tentar { Thread.sleep( 3000 ); } capturar (InterruptedException e) {}
retornar número;
}
}

público Cadeia getString() {
sincronizado ( stringLock ) {
retornar str;
}
}

privado Cadeia str = "Olá, Mundo!"; //$NON-NLS-1$
privado int número = 10;
privado Objeto numberLock = novo Objeto();
privado Objeto stringLock = novo Objeto();

público estático nulo principal( Cadeia[] args ) {
final SynchronizedMethod_Solution dados = novo SynchronizedMethod_Solution();
Executável numberReader = novo Executável() {
público nulo executar() {
System.out.println( "Obtendo número..." ); //$NON-NLS-1$
System.out.println( data.getNumber() );
}
};
Executável stringReader = novo Executável() {
público nulo executar() {
System.out.println( "Obtendo cadeia..." ); //$NON-NLS-1$
System.out.println( data.getString() );
}
};

(novo Cadeia( numberReader ) ).start();
(novo Cadeia( stringReader ) ).start();
}