Olá !!!
Galera, me ajudem a exclarecer algumas dúvidas.
1- Gera algum problema se o método “notify” for chamado antes do método “wait” ?
Se a resposta acima for sim:
1- Dependendo da máquina virtual, a Thread “Main” pode obter o sincronismo do objeto “sa” e, consequentemente, ela irá chamar o método “notify” antes que a Thread “t1” chame o método “wait” ?
De acordo com alguns livros que andei estudando, não tem como, dependendo da máquina virtual, saber se a Thread “Main” irá ou não obter o bloqueio do objeto “sa”.
Me ajudem se eu estiver falando bobeira. 
class B {
private static String[] sa = new String[]{"Not Done","X","Y","Z"};
public static void main (String[] args) {
Thread t1 = new A(sa);
t1.start();
synchronized (sa) {
sa[0] = "Done";
sa[1] = "A";
sa[2] = "B";
sa[3] = "C";
sa.notify();
}}}
class A extends Thread {
private String[] sa = new String[]{"Not Done","X","Y","Z"};
public A(String[] sa) { this.sa = sa; }
public void run() {
synchronized (sa) {
while (!sa[0].equals("Done")) {
try {
sa.wait();
}
catch (InterruptedException ie) {}
}
}
System.out.print(sa[1] + sa[2] + sa[3]);
}}
Obrigado pela atenção