data structure used for producer consumer situations. Allows reading and writing so long as there is data and the buffer is not full, respectively.