The reason for any deadlock (local or distributed) is taking locks on same
objects in different order, e. g:
Thread 1 locks A, B
Thread 2 locks B, A
  => thread 1 holds A and waits on B, thread 2 holds B and waits on A

When doing putAll, Ignite iterates over the provided map and locks keys in
the iterator order.
TreeMap is sorted, so it solves the problem automatically. Locks are taken
in the same order on all nodes/threads, preventing deadlocks.
HashMap can reorder elements arbitrarily, on the other hand, causing random
deadlocks.


For withKeepBinary cache you have two options:
- LinkedHashMap preserves insertion order. Make sure you always populate
the map in the same order.
- TreeMap with Comparator. Implement Comparator that sorts your keys the
right way, probably based on a particular field of the BinaryObject



On Wed, Feb 12, 2020 at 12:12 AM Григорий Доможиров <
[email protected]> wrote:

> Hello.
> As I know it's recommended to use putAll with TreeMap to avoid deadlocks
> (is there any other reasons?). If so, how to deal with .withKeepBinary
> cache, where you have to provide Map of BinaryObjects, which are not
> Comparable, and thus couldn't be put in TreeMap?
>
> Also, why deadlocks could happen with HashMap, and why using TreeMap
> prevents it?
>

Reply via email to