Как изменить доступ к ресурсам в deadLock - PullRequest
0 голосов
/ 06 февраля 2019
        I am searching for a way to resolve  a deadlock. Take a look at this sample kotlin code which shows a simple dead lock:

            data class Human(val name:String) {
    @Synchronized fun sayHi(to: Human){
        println("$name saying hi to ${to.name}")
        Thread.sleep(500)
        to.sayHiBack(this)

    }
    @Synchronized fun sayHiBack(to: Human){
        println("$name saying hi back to ${to.name}")
    }

}
fun main() {
    val adam = Human("adam")
    val eve = Human("eve")
    val adamThread = Thread {
        adam.sayHi(eve)
    }.apply {
        start()
    }

    val eveThread = Thread {
        eve.sayHi(adam)
    }.apply {
        start()
    }
    adamThread.join()
    eveThread.join()
}

поэтому Адам пытается поздороваться с Евой, а нить Евы пытается сказать привет Адаму, поэтому они зашли в тупик, ожидая друг друга.

поэтому, чтобы решить проблему блокировки, мы обычно меняем порядок доступа к ресурсам.

, поэтому я подумал, что основная функция должна выглядеть следующим образом:

fun main() {
    val adam = Human("adam")
    val eve = Human("eve")
    val adamThread = Thread {
        adam.sayHi(eve)
    }.apply {
        start()
    }


    adamThread.join() . //wait until adam thread finishes

    val eveThread = Thread {
        eve.sayHi(adam)
    }.apply {
        start()
    }

    eveThread.join()
}

так, что один поток вызывается только после того, как другой полностью завершил (присоединился).но это как-то тормозит, верно?Какой лучший способ сделать это?

...