Below is the excerpt from Effective Java by Joshua:
If you do synchronize your class internally, you can use various
techniques to achieve high concurrency, such as lock splitting, lock
striping, and nonblocking concurrency control.
Lock splitting is about using different locks for a different part of a classes functionality; e.g. one lock for reads and another for writes.
Lock striping is about using different locks for different parts (stripes) of the data structure that a class manages; e.g. dividing a map into submaps, each with their own locks.