Skip to content

Commit 67199f9

Browse files
committed
fix mistake in concurrency.Task5
1 parent 850c7f7 commit 67199f9

File tree

2 files changed

+29
-7
lines changed

2 files changed

+29
-7
lines changed

src/main/kotlin/cub/concurrent/answers/Task5.kt

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,18 +30,18 @@ class TransactionalBankAccount : BankAccount {
3030
override val balance: Int
3131
get() = account.get().balance
3232

33-
fun <T> transaction(block: BankAccount.() -> T): T {
34-
var result: T
33+
fun transaction(block: BankAccount.() -> Boolean): Boolean {
3534
do {
3635
val currentAccount = account.get()
3736
val newAccount = currentAccount.copy()
38-
result = block(newAccount)
37+
if (!block(newAccount))
38+
return false
3939
} while (!account.compareAndSet(currentAccount, newAccount))
40-
return result
40+
return true
4141
}
4242

4343
override fun deposit(amount: Int) {
44-
transaction { deposit(amount) }
44+
transaction { deposit(amount); true }
4545
}
4646

4747
override fun withdraw(amount: Int): Boolean {
@@ -57,6 +57,16 @@ fun TransactionalBankAccount.buyWithCashback(price: Int, cashbackPercentage: Int
5757
} else false
5858
}
5959

60+
fun transactionalBankAccountTest0() {
61+
val account = TransactionalBankAccount()
62+
account.deposit(1_500)
63+
account.transaction {
64+
withdraw(1_000)
65+
withdraw(1_000)
66+
}
67+
check(account.balance == 1_500)
68+
}
69+
6070
fun transactionalBankAccountTest1() {
6171
val account = TransactionalBankAccount()
6272
val t1 = thread {
@@ -110,6 +120,7 @@ fun transactionalBankAccountTest3() {
110120
}
111121

112122
fun main() {
123+
transactionalBankAccountTest0()
113124
transactionalBankAccountTest1()
114125
transactionalBankAccountTest2()
115126
transactionalBankAccountTest3()

src/main/kotlin/cub/concurrent/tasks/Task5.kt

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,12 +48,12 @@ class TransactionalBankAccount : BankAccount {
4848
override val balance: Int
4949
get() = TODO()
5050

51-
fun <T> transaction(block: BankAccount.() -> T): T {
51+
fun transaction(block: BankAccount.() -> Boolean): Boolean {
5252
TODO()
5353
}
5454

5555
override fun deposit(amount: Int) {
56-
transaction { deposit(amount) }
56+
transaction { deposit(amount); true }
5757
}
5858

5959
override fun withdraw(amount: Int): Boolean {
@@ -62,6 +62,16 @@ class TransactionalBankAccount : BankAccount {
6262

6363
}
6464

65+
fun transactionalBankAccountTest0() {
66+
val account = TransactionalBankAccount()
67+
account.deposit(1_500)
68+
account.transaction {
69+
withdraw(1_000)
70+
withdraw(1_000)
71+
}
72+
check(account.balance == 1_500)
73+
}
74+
6575
fun transactionalBankAccountTest1() {
6676
val account = TransactionalBankAccount()
6777
val t1 = thread {
@@ -115,6 +125,7 @@ fun transactionalBankAccountTest3() {
115125
}
116126

117127
fun main() {
128+
transactionalBankAccountTest0()
118129
transactionalBankAccountTest1()
119130
transactionalBankAccountTest2()
120131
transactionalBankAccountTest3()

0 commit comments

Comments
 (0)