Есть два класса
Deadlock1.java
class Client {
final Object resource1 = "resource1";
final Object resource2 = "resource2";
void doS1() {
synchronized(resource1) {}
}
void doS2() {
synchronized(resource2) {}
}
}
public class Deadlock1 {
public static void main(String[] args) {
Client client = new Client();
new Thread(
() ->
{
client.doS1();
try {
Thread.sleep(50);
} catch (InterruptedException e) {
}
client.doS2();
}).start();
new Thread(
() ->
{
client.doS2();
try {
Thread.sleep(50);
} catch (InterruptedException e) {
}
client.doS1();
}).start();
}
}
and Deadlock2.java
class Client {
final Object resource1 = "resource1";
final Object resource2 = "resource2";
}
public class Deadlock2{
public static void main(String[] args) {
Client client = new Client();
new Thread(
() ->
{
synchronized (client.resource1) {
try {
Thread.sleep(50);
} catch (InterruptedException e) {
}
synchronized (client.resource2) {}
}
}).start();
new Thread(
() ->
{
synchronized (client.resource2) {
try {
Thread.sleep(50);
} catch (InterruptedException e) {
}
synchronized (client.resource1) {}
}
}).start();
}
}
В Deadlock1 дедлок не просиходит, а в Deadlock2 - происходит. Не могу понять в чём разница? И почему в Deadlock2 синхроблок это часть кода потока, а не класса Client - т.е какого-то участка кода,который могут выполнять разные потоки?
В Deadlock2 каждый поток сначала захватывают одну блокировку, и удерживая ее пытается захватить вторую. Закономерно что получается дедлок.
А в Deadlock1 каждый поток захватывает свою блокировку, а затем ее отпускает , и после паузы захватывает другую. Закономерно что нет дедлока.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Нужно выводить изображение на канвасе через объект, все изображения необходимо добавить в объектПоскажите, как это сделать?
Уважаемые не подскажите или не подтолкнете к верному решениюЕсть два массива
Так я передаю объект с данными в родительском контроле,который находится в popup окне: