Exemplo

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

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

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

público estático nulo principal ( Cadeia[] args ) {
final SynchronizedThis_Example dados = novo SynchronizedThis_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
Declare um bloqueio separado explícito para proteger os conjuntos de dados diferentes.


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 SynchronizedThis_Solution dados = novo SynchronizedThis_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();
}