public void safeMethod(Object obj1, Object obj2) {
long longObj1 = obj1.hashCode();
long longObj2 = obj2.hashCode();
obj1 = longObj1 > longObj2 ? obj1: obj2;
obj2 = longObj2 > longObj1 ? obj2: obj1;
synchronized (obj1) {
longTimeMethod();
synchronized (obj2) {
unsafeMethod(obj1,obj2);
}
}
}
package com.javarush.task.task27.task2706;
/*
Убираем deadlock
*/
public class Solution {
public void safeMethod(Object obj1, Object obj2) {
long longObj1 = obj1.hashCode();
long longObj2 = obj2.hashCode();
obj1 = longObj1 > longObj2 ? obj1: obj2;
obj2 = longObj2 > longObj1 ? obj2: obj1;
synchronized (obj1) {
longTimeMethod();
synchronized (obj2) {
unsafeMethod(obj1,obj2);
}
}
}
public void longTimeMethod() {
try {
Thread.sleep(100);
} catch (InterruptedException ignored) {
}
}
protected void unsafeMethod(Object obj1, Object obj2) {
System.out.println(obj1 + " " + obj2);
}
public static void main(String[] args) {
final Object o1 = new Object();
final Object o2 = new Object();
final Solution solution = new Solution();
new Thread() {
@Override
public void run() {
solution.safeMethod(o1, o2);
}
}.start();
new Thread() {
@Override
public void run() {
solution.safeMethod(o2, o1);
}
}.start();
}
}