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