Используйте lock()
, если у вас нет другой причины делать копии. Взаимные блокировки могут возникать только в том случае, если вы запрашиваете несколько блокировок в разных порядках, например:
Тема 1:
lock(A) {
// .. stuff
// Next lock request can potentially deadlock with 2
lock(B) {
// ... more stuff
}
}
Тема 2:
lock(B) {
// Different stuff
// next lock request can potentially deadlock with 1
lock(A) {
// More crap
}
}
Здесь поток 1 и поток 2 могут вызвать взаимоблокировку, поскольку поток 1 может удерживать A
, в то время как поток 2 удерживает B
, и ни один из них не может продолжаться, пока другой не снимет свою блокировку.
Если вам нужно взять несколько замков, всегда делайте это в одном и том же порядке. Если вы берете только одну блокировку, то вы не будете вызывать взаимоблокировку ... если только вы не удержите блокировку во время ожидания ввода пользователя, но технически это не тупик и ведет к другому моменту: никогда больше не удерживайте блокировку чем вы должны.