Ciao!
Ho un codice per fare delle prove sul funzionamento dei thread in Java. Non sono molto esperto , ma i due thread, creati da due oggetti diversi, dovrebbero essere indipendenti e agire su variabili indipendenti.
Dall'output del programma però non sembra che le cose vadano così, nonostante gli array hi[] separati (uno per ciascun oggetto) e i metodi dichiarati synchronized. A volte uno dei due array non viene inizializzato, a volte uno contiene soltanto una parte dei valori corretti. Perché succede questo? Come si può evitare?
Grazie,

Fabio





codice:
package pack1;

public class Thread1Example {

	public static void main(String[] args) {
		
		Writer w1 = new Writer("Thread1");
		Writer w2 = new Writer("Thread2");
		String[] arr =  new String[10];
		w1.setString(arr);
		w2.setString(arr);	
		
		w1.start();
		w2.start();
		
		w1.printString();
		w2.printString();
	}

}

package pack1;

public class Writer extends Thread {

	  private volatile String[] hi = new String[10];
	  private String name1;
	  public Writer(String nam)
	  {
		  super(nam);
		  this.name1 = nam;
	  }
	  public synchronized void printString()
	  {
		  int n=0;
		  
		  System.out.println("This array belongs to " + this.name1);
		  
		  for(n=0;n<10;n++)
		  {
			  System.out.println(hi[n]);
		  }	  
		  
	  }
	  public void setString(String[] hii)
	  {
		  hi=hii;
	  }
	  public void run()
	  {

		method1();		  
	  }
	  public synchronized void method1()
	  {
		  int n=0;
		  for(n=0;n<10;n++)
		  {
			  if(name1.compareTo("Thread1")==0)
			  {
				  hi[n]="yes";
				  try
				  {
		
				  }
			  		  catch(Exception except)
			  		  {
			  			  System.out.print(except);
			  		  }
			  }
			  else
			  {
				  hi[n]="no";

				  try
				  {

				  }
			  		  catch(Exception except)
			  		  {
			  			  System.out.print(except);
			  		  }
			  }
				  
		  }
	
	}
}

L'output è (e cambia quasi ogni volta che si esegue il programma):

codice:
This array belongs to Thread1
null
null
null
null
null
null
null
null
null
no
This array belongs to Thread2
no
no
yes
yes
yes
yes
yes
yes
yes
yes