Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package Threads
- import java.util.*
- import java.util.concurrent.locks.Lock
- import java.util.concurrent.locks.ReentrantLock
- fun main() {
- val deadlock = DeadlockOrnek()
- val t1 = Thread(Runnable { deadlock.thread1Fonk() })
- val t2 = Thread(Runnable { deadlock.thread2Fonk() })
- t1.start()
- t2.start()
- t1.join()
- t2.join()
- deadlock.threadOver()
- }
- class Hesap {
- var bakiye = 10000
- fun paraCek(miktar: Int) {
- bakiye -= miktar
- }
- fun paraYatir(miktar: Int) {
- bakiye += miktar
- }
- companion object {
- fun paraTransferi(h1: Hesap, h2: Hesap, miktar: Int) {
- h1.paraCek(miktar)
- h2.paraYatir(miktar)
- }
- }
- }
- class DeadlockOrnek {
- val h1 = Hesap()
- val h2 = Hesap()
- val rand = Random()
- val LOCK1 = ReentrantLock()
- val LOCK2 = ReentrantLock()
- fun thread1Fonk() {
- // LOCK1.lock() // ilk anahtarı t1 aldı
- // LOCK2.lock() // ikinci anahtarı t2 aldı ise deadlock oluşur (ikisi de birbirini bekler, ilerleyemez)
- lockCheck(LOCK1, LOCK2)
- for (i in 1..5000) {
- Hesap.paraTransferi(h1, h2, rand.nextInt(100))
- }
- LOCK1.unlock()
- LOCK2.unlock()
- }
- fun thread2Fonk() {
- // LOCK2.lock()
- // LOCK1.lock()
- lockCheck(LOCK2, LOCK1)
- for (i in 1..5000) {
- Hesap.paraTransferi(h2, h1, rand.nextInt(100))
- }
- LOCK2.unlock()
- LOCK1.unlock()
- }
- fun lockCheck(lock1: Lock, lock2: Lock) {
- var lock1EldeEdildi = false
- var lock2EldeEdildi = false
- while (true) {
- lock1EldeEdildi = lock1.tryLock()
- lock2EldeEdildi = lock2.tryLock()
- if (lock1EldeEdildi && lock2EldeEdildi)
- return
- if (lock1EldeEdildi)
- lock1.unlock()
- if (lock2EldeEdildi)
- lock2.unlock()
- }
- }
- fun threadOver() {
- println("H1 Bakiye: ${h1.bakiye}\nH2 Bakiye: ${h2.bakiye}\nToplam Bakiye: ${h1.bakiye + h2.bakiye}")
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement