Действия между lock() и unlock() желательно выполнять в try/finally блоках. Это существенно увеличит надежность программы.