-
Notifications
You must be signed in to change notification settings - Fork 4
/
AccountExample.java
133 lines (110 loc) · 3.84 KB
/
AccountExample.java
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
125
126
127
128
129
130
131
132
133
package org.alxkm.antipatterns.racecondition;
import java.util.stream.IntStream;
/**
* A class demonstrating different methods of incrementing an account amount with various synchronization techniques.
*/
public class AccountExample {
/**
* The main method demonstrating different methods of incrementing an account amount.
*
* @param args The command-line arguments (unused).
*/
public static void main(String[] args) {
unsafeIncrement();
safeSynchronizedIncrement();
safeLockIncrement();
safeAtomicIncrement();
}
/**
* Demonstrates unsafe incrementing of an account amount without synchronization.
*/
private static void unsafeIncrement() {
// Setup
AccountAmount accountAmount = new AccountAmount();
Runnable incrementTask = () -> IntStream.range(0, 100).forEach(i -> accountAmount.unsafeIncrementAmount());
// Thread creation
Thread t1 = new Thread(incrementTask);
Thread t2 = new Thread(incrementTask);
// Thread execution
t1.start();
t2.start();
// Wait for threads to finish
try {
t1.join();
t2.join();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
// Output result
System.out.println("Unsafe increment = " + accountAmount.getAmount());
}
/**
* Demonstrates safe synchronized incrementing of an account amount.
*/
private static void safeSynchronizedIncrement() {
// Setup
AccountAmount accountAmount = new AccountAmount();
Runnable incrementTask = () -> IntStream.range(0, 100).forEach(i -> accountAmount.safeSynchronizedIncrementAmount());
// Thread creation
Thread t1 = new Thread(incrementTask);
Thread t2 = new Thread(incrementTask);
// Thread execution
t1.start();
t2.start();
// Wait for threads to finish
try {
t1.join();
t2.join();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
// Output result
System.out.println("Safe synchronized increment = " + accountAmount.getAmount());
}
/**
* Demonstrates safe lock-based incrementing of an account amount.
*/
private static void safeLockIncrement() {
// Setup
AccountAmount accountAmount = new AccountAmount();
Runnable incrementTask = () -> IntStream.range(0, 100).forEach(i -> accountAmount.safeLockIncrementAmount());
// Thread creation
Thread t1 = new Thread(incrementTask);
Thread t2 = new Thread(incrementTask);
// Thread execution
t1.start();
t2.start();
// Wait for threads to finish
try {
t1.join();
t2.join();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
// Output result
System.out.println("Safe lock increment = " + accountAmount.getAmount());
}
/**
* Demonstrates safe atomic incrementing of an account amount.
*/
private static void safeAtomicIncrement() {
// Setup
AccountAmount accountAmount = new AccountAmount();
Runnable incrementTask = () -> IntStream.range(0, 100).forEach(i -> accountAmount.incrementAtomicAmount());
// Thread creation
Thread t1 = new Thread(incrementTask);
Thread t2 = new Thread(incrementTask);
// Thread execution
t1.start();
t2.start();
// Wait for threads to finish
try {
t1.join();
t2.join();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
// Output result
System.out.println("Safe atomic increment = " + accountAmount.getAtomicInteger());
}
}