Мне кажется, что в данном случае надо организовать синхронизацию не на уровне элементов массива(вариант 3), а на уровне читателей-писателей, т. е. объекты синхронизации создаются не для каждого элемента массива, а для каждого читателя-писателя(ведь именно их и надо разделить). При обращению к элементу проверять, не занят ли он кем, если занят, то ждать освобождения. А заботу о сигнализации освобождения элемента возложить на того, кто его занял. Получится некий массив: кто занял и что занял.