Advertisement
Guest User

Untitled

a guest
Mar 21st, 2019
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.05 KB | None | 0 0
  1. package Threads
  2.  
  3. import java.util.*
  4. import java.util.concurrent.locks.Lock
  5. import java.util.concurrent.locks.ReentrantLock
  6.  
  7. fun main() {
  8.  
  9. val deadlock = DeadlockOrnek()
  10.  
  11. val t1 = Thread(Runnable { deadlock.thread1Fonk() })
  12. val t2 = Thread(Runnable { deadlock.thread2Fonk() })
  13.  
  14. t1.start()
  15. t2.start()
  16.  
  17. t1.join()
  18. t2.join()
  19.  
  20. deadlock.threadOver()
  21. }
  22.  
  23. class Hesap {
  24. var bakiye = 10000
  25.  
  26.  
  27. fun paraCek(miktar: Int) {
  28. bakiye -= miktar
  29. }
  30.  
  31. fun paraYatir(miktar: Int) {
  32. bakiye += miktar
  33. }
  34.  
  35. companion object {
  36. fun paraTransferi(h1: Hesap, h2: Hesap, miktar: Int) {
  37. h1.paraCek(miktar)
  38. h2.paraYatir(miktar)
  39. }
  40. }
  41. }
  42.  
  43. class DeadlockOrnek {
  44. val h1 = Hesap()
  45. val h2 = Hesap()
  46. val rand = Random()
  47.  
  48. val LOCK1 = ReentrantLock()
  49. val LOCK2 = ReentrantLock()
  50.  
  51. fun thread1Fonk() {
  52. // LOCK1.lock() // ilk anahtarı t1 aldı
  53. // LOCK2.lock() // ikinci anahtarı t2 aldı ise deadlock oluşur (ikisi de birbirini bekler, ilerleyemez)
  54.  
  55. lockCheck(LOCK1, LOCK2)
  56.  
  57. for (i in 1..5000) {
  58. Hesap.paraTransferi(h1, h2, rand.nextInt(100))
  59. }
  60.  
  61. LOCK1.unlock()
  62. LOCK2.unlock()
  63. }
  64.  
  65. fun thread2Fonk() {
  66. // LOCK2.lock()
  67. // LOCK1.lock()
  68.  
  69. lockCheck(LOCK2, LOCK1)
  70.  
  71. for (i in 1..5000) {
  72. Hesap.paraTransferi(h2, h1, rand.nextInt(100))
  73. }
  74.  
  75. LOCK2.unlock()
  76. LOCK1.unlock()
  77. }
  78.  
  79. fun lockCheck(lock1: Lock, lock2: Lock) {
  80. var lock1EldeEdildi = false
  81. var lock2EldeEdildi = false
  82.  
  83. while (true) {
  84. lock1EldeEdildi = lock1.tryLock()
  85. lock2EldeEdildi = lock2.tryLock()
  86.  
  87. if (lock1EldeEdildi && lock2EldeEdildi)
  88. return
  89.  
  90. if (lock1EldeEdildi)
  91. lock1.unlock()
  92.  
  93. if (lock2EldeEdildi)
  94. lock2.unlock()
  95. }
  96. }
  97.  
  98. fun threadOver() {
  99. println("H1 Bakiye: ${h1.bakiye}\nH2 Bakiye: ${h2.bakiye}\nToplam Bakiye: ${h1.bakiye + h2.bakiye}")
  100. }
  101. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement