@@ -44,12 +44,9 @@ money from user to user.
44
44
}
45
45
}
46
46
```
47
- 1. Immutable map of users:
47
+ 1. Mutable map of users:
48
48
```
49
- Map<Integer, User> userMap = Map.of(
50
- 1, new User(1, 40),
51
- 2, new User(2, 33)
52
- );
49
+ userMap = [[1, new User(1, 40)], [2, new User(2, 33)]]
53
50
```
54
51
1. We want to provide tread-safe read and writes on that map
55
52
* we will use `ReadWriteLock` interface
@@ -90,26 +87,31 @@ second one
90
87
```
91
88
ReadWriteLock lock = new ReentrantReadWriteLock();
92
89
LockExecutor executor = new LockExecutor(lock);
93
-
94
- var transferred = executor.write(() -> {
90
+
91
+ executor.write(() -> {
95
92
var transfer = PositiveInt.of(15);
96
- return Map.of(1, userMap.get(1).outcome(transfer),
97
- 2, userMap.get(2).income(transfer));
93
+ userMap.replace(1, userMap.get(1).outcome(transfer));
94
+ userMap.replace(2, userMap.get(2).income(transfer));
95
+
96
+ return Void.class;
98
97
});
99
-
100
- assertThat(transferred .get(1).getBalance(), is(25));
101
- assertThat(transferred .get(2).getBalance(), is(48));
98
+
99
+ assertThat(userMap .get(1).getBalance(), is(25));
100
+ assertThat(userMap .get(2).getBalance(), is(48));
102
101
```
103
102
1. We want to sum all balances from all users
104
103
```
105
104
ReadWriteLock lock = new ReentrantReadWriteLock();
106
105
LockExecutor executor = new LockExecutor(lock);
107
-
106
+
108
107
var balanceAll = executor.read(() -> userMap.values()
109
108
.stream()
110
109
.map(User::getBalance)
111
110
.mapToInt(x -> x)
112
111
.sum());
113
-
112
+
114
113
assertThat(balanceAll, is(73));
115
- ```
114
+ ```
115
+
116
+ **Remark: thread-safety is guarantee under assumption, that
117
+ all reads and writes will go through the same executor object.**
0 commit comments