1. A method of managing concurrent access requests to a data segment, comprising: tracking shared lock requests from a plurality of processes in a first data structure when no exclusive waiter is present, wherein the first data structure tracks the total number of shared locks; tracking shared lock requests in a second data structure when an exclusive waiter is present and the total number of shared locks is greater than zero, wherein the second data structure tracks the number of shared locks held by each of the plurality of processes; tracking recursive shared lock requests in the second data structure when an exclusive waiter is present and the total number of shared locks is zero; granting an exclusive lock to the exclusive waiter when the total number of shared locks is zero and the number of shared locks held by each of the plurality of processes is zero.