public T Get() { for (int i = Thread.VolatileRead(ref poolIndex); i >= 0; i--) { T value = pools[i].GetIfSpaceAvailable(); if (value != default(T)) { value.Index |= i << 24; return(value); } } lock (sync) { for (; ;) { int index = Thread.VolatileRead(ref poolIndex); T value = pools[index].GetIfSpaceAvailable(); if (value != default(T)) { value.Index |= index << 24; return(value); } int newIndex = Thread.VolatileRead(ref poolIndex) + 1; pools[newIndex] = new LockFreeFastPool <T>(minSize << newIndex); Thread.VolatileWrite(ref poolIndex, newIndex); } } }
public FastResizablePool() { poolIndex = 0; sync = new object(); pools = new LockFreeFastPool <T> [maxPoolsQty]; pools[0] = new LockFreeFastPool <T>(minSize); }