Esempio

public int getNumber() {
synchronized ( this ) {
try { Thread.sleep( 3000 ); } catch (InterruptedException e) {}
return number;
}
}

public String getString() {
synchronized ( this ) {
return str;
}
}

private String str = "Hello world!"; //$NON-NLS-1$
private int number = 10;

public static void main( String[] args ) {
final SynchronizedThis_Example data = new SynchronizedThis_Example();
Runnable numberReader = new Runnable() {
public void run() {
System.out.println( "Getting number..." ); //$NON-NLS-1$
System.out.println( data.getNumber() );
}
};
Runnable stringReader = new Runnable() {
public void run() {
System.out.println( "Getting string..." ); //$NON-NLS-1$
System.out.println( data.getString() );
}
};

(new Thread( numberReader ) ).start();
(new Thread( stringReader ) ).start();
}

Soluzione
Dichiarare un blocco separato esplicito per proteggere diverse serie di dati.


public int getNumber() {
synchronized ( numberLock ) {
try { Thread.sleep( 3000 ); } catch (InterruptedException e) {}
return number;
}
}

public String getString() {
synchronized ( stringLock ) {
return str;
}
}

private String str = "Hello world!"; //$NON-NLS-1$
private int number = 10;
private Object numberLock = new Object();
private Object stringLock = new Object();

public static void main( String[] args ) {
final SynchronizedThis_Solution data = new SynchronizedThis_Solution();
Runnable numberReader = new Runnable() {
public void run() {
System.out.println( "Getting number..." ); //$NON-NLS-1$
System.out.println( data.getNumber() );
}
};
Runnable stringReader = new Runnable() {
public void run() {
System.out.println( "Getting string..." ); //$NON-NLS-1$
System.out.println( data.getString() );
}
};

(new Thread( numberReader ) ).start();
(new Thread( stringReader ) ).start();
}