Возможно ли, что это симуляция сценария скрытой блокировки Java только с одним объектом, разделенным между несколькими потоками?Имитация мертвой блокировки Java-потока
Например, у меня есть класс
public class MyClass {
public synchronized void syncInstanceMethod1(){
/// Anything here to simulate a dead lock
}
public synchronized void syncInstanceMethod2(){
/// Anything here to simulate a dead lock
}
public static synchronized void syncStaticMethod1(){
/// Anything here to simulate a dead lock
}
public static synchronized void syncStaticMethod2(){
/// Anything here to simulate a dead lock
}
public void instanceMethod1(){
/// Anything here to simulate a dead lock
}
public void instanceMethod2(){
/// Anything here to simulate a dead lock
}
public static void main(String[] args) {
MyClass shared = new MyClass(); // Allowed to create only one instance
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
// Do whatever here to simulate dead lock like calling various methods on the shared object in any order
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
// Do whatever here to simulate dead lock like calling various methods on the shared object in any order
}
});
// Allowed to create more threads like above. t3 , t4 etc...
t1.start();
t2.start();
}
}
Может быть, это невозможно. Поскольку обычной ситуацией, в которой может произойти мертвая блокировка, является блок кода, где он получает блокировку одного одного объекта и, не выпуская его, пытается получить блокировку на другом объекте.
Мы можем смоделировать эту ситуацию из одного из синхронных методов экземпляра, вызвав статический синхронизированный метод, пытаясь заблокировать объект класса, удерживая блокировку на «этом». Но для возникновения тупика нам нужна аналогичная ситуация в обратном порядке в другом месте.
Кроме того, поскольку статический метод не может получить доступ к «этому», он не может блокировать это «и», и два метода синхронизированного экземпляра не могут работать одновременно, эти вещи полагают, что мы не можем имитировать мертвую блокировку здесь. Я прав?
Статический метод может получить доступ к 'this' в виде статической переменной (по аналогии с одноплодной шаблон). – MeetTitan