-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathSolution.java
More file actions
124 lines (104 loc) · 5.44 KB
/
Solution.java
File metadata and controls
124 lines (104 loc) · 5.44 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
//Yet not entirely with the fornicators of this world, or with the covetous, or extortioners, or with idolaters; for then must you needs go out of the world (1Cor 5:10)
import java.util.Set;
/*
Убираем deadLock используя открытые вызовы
*/
public class Solution {
public static void main(String[] args) {
final long deadLineTime = System.currentTimeMillis() + 5000; //waiting for 5 sec
final RealEstate realEstate = new RealEstate();
Set<Apartment> allApartments = realEstate.getAllApartments();
final Apartment[] apartments = allApartments.toArray(new Apartment[allApartments.size()]);
for (int i = 0; i < 20; i++) {
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
realEstate.revalidate();
}
}
}, "RealEstateThread" + i).start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < apartments.length; i++) {
apartments[i].revalidate(true);
}
}
}, "ApartmentThread" + i).start();
}
Thread deamonThread = new Thread(new Runnable() {
@Override
public void run() {
while (System.currentTimeMillis() < deadLineTime)
try {
Thread.sleep(2);
} catch (InterruptedException ignored) {
}
System.out.println("The dead lock occurred");
}
});
deamonThread.setDaemon(true);
deamonThread.start();
}
}
/*
Убираем deadLock используя открытые вызовы
Синхронизированные методы, которые вызывают внутри себя синхронизированные методы других классов, приводят к dead-lock-у.
1. Перенесите синхронизацию с метода в синхронизированный блок, куда поместите лишь необходимые части кода.
2. Уберите избыточную синхронизацию методов.
3. В стеке вызова методов не должно быть перекрестной синхронизации, т.е. такого synchronizedMethodAClass().synchronizedMethodBClass().synchronizedMethodAClass()
Этот способ избавления от дэдлока называется «открытые вызовы«, о нем читайте в дополнительном материале к лекции.
Метод main не участвует в тестировании.
Требования:
1. Должна быть обеспечена возможность корректного взаимодействия объектов типа Apartment и RealEstate без возникновения взаимных блокировок.
2. Метод up класса RealEstate должен быть объявлен без модификатора synchronized.
3. Метод revalidate класса RealEstate должен быть объявлен без модификатора synchronized.
4. Метод revalidate класса Apartment должен быть объявлен без модификатора synchronized.
5. Метод revalidate класса RealEstate должен содержать один synchronized блок.
6. В synchronized блоке метода revalidate класса RealEstate должен содержаться вызов метода revalidate на объекте apartment с параметром randomValue.
package com.javarush.task.task27.task2708;
import java.util.Set;
*
Убираем deadLock используя открытые вызовы
*
public class Solution {
public static void main(String[] args) {
final long deadLineTime = System.currentTimeMillis() + 5000; //waiting for 5 sec
final RealEstate realEstate = new RealEstate();
Set<Apartment> allApartments = realEstate.getAllApartments();
final Apartment[] apartments = allApartments.toArray(new Apartment[allApartments.size()]);
for (int i = 0; i < 20; i++) {
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
realEstate.revalidate();
}
}
}, "RealEstateThread" + i).start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < apartments.length; i++) {
apartments[i].revalidate(true);
}
}
}, "ApartmentThread" + i).start();
}
Thread deamonThread = new Thread(new Runnable() {
@Override
public void run() {
while (System.currentTimeMillis() < deadLineTime)
try {
Thread.sleep(2);
} catch (InterruptedException ignored) {
}
System.out.println("The dead lock occurred");
}
});
deamonThread.setDaemon(true);
deamonThread.start();
}
}
*/