Experimentation with concurrent data structures

I have written 2 separate implementations of a double linked list which
allows safe access and manipulation by multiple threads in a distributed
environment. The difference is the degree of concurrency, wait-time and
performance that each one offers.

Implementation 1 is the basic implementation having the widely used
method of locking the entire data structure whenever we attempt to
access/modify any part of the data structure. This is also called as
Coarse-Grained locking or top-level locking

Implementation 2 tries to improve on the performance bottlenecks posed
by the first implementation. Rather than locking the entire data
structure, here I use node-level locks. So multiple threads will be able
to access/modify disjoint parts of the data structure without any
wait-time.  So we achieve higher degree of concurrency and performance.