public class FileLock { DateTime time; String title; public FileLock(DateTime time, String title) { this.time = time; this.title = title; } override equals/hashCode based on those two properties static Hashtable<FileLock, FileLock> unqiueLocks = new Hashtable<FileLock, FileLock>(); static lockObject = new Object(); public static FileLock getLock(DateTime time, String title) { synchronized (lockObject) { FileLock lock = new FileLock(time, title); if (unqiueLocks.ContainsKey(lock)) { return unqiueLocks.get(lock); } else { unqiueLocks.put(lock, lock); return lock; } } } }