Olá gente, eu de novo … rsrs e o testKiller …
sei que parece sacanagem rsrs… mas a pergunta abaixo … eu li , li , li coloquei no eclipse, debuguei … li de novo debuguei … e eu não consigo achar porque raios que dá essa resposta … >< eis o código:
public class Transfers {
public static void main(String[] args) throws Exception {
Record r1 = new Record();
Record r2 = new Record();
doTransfer(r1, r2, 5);
doTransfer(r2, r1, 2);
doTransfer(r1, r2, 1);
// print the result
System.out.println("rl = " + r1.get() +", r2=" + r2.get());
}
private static void doTransfer(final Record a, final Record b, final int amount) {
Thread t = new Thread() {
public void run() {
new Clerk().transfer(a, b, amount);
}
};
t.start();
}
}
class Clerk {
public synchronized void transfer(Record a, Record b, int amount){
synchronized (a) {
synchronized (b) {
a.add(-amount);
b.add(amount);
}
}
}
}
class Record {
int num=10;
public int get() {
return num;
}
public void add(int n) {
num = num + n;
}
}
Opções:
If Transfers.main() is run, which three are true? (Choose three.)
A. The output may be ?r1 = 6, r2 = 14?.
B. The output may be ?r1 = 5, r2 = 15?.
C. The output may be ?r1 = 8, r2 = 12?.
D. The code may run (and complete) with no output.
E. The code may deadlock (without completing) with no output.
F. M IllegalStateException or InterruptedException may be thrown at
runtime.
as corretas são A, B e E
e olhei o código … tudo sincronizado … r1 e r2 são duas instancias distintas… e não entendi o porque dessa possibilidade … de sair esses numeros diferentes …
e
se é possivel acontecer a A e a B porque não é possivel acontecer a C ???
outra coisa que não entendi foi pq a E está correta?
não consigo enchergar aí uma forma do código entrar em empasse… não tem join … não tem wait … não tem spleep …
e outra . … mesmo que entrasse em impasse, de acordo com o livro da kathy a JVM iria escolher uma thread para executar … tornando impossivel travar TUDO e não der nem um outputzinhu rs.
alguém? por favor?