If you need to make a choice betweet notify and notifyAll it has not only to do with the number of threads that could be waiting, but also with the functionalities of your program. Because in the assignment you must also be able to delete records, you have to use notifyAll instead of notify; otherwise you might end up with a program which never finishes.
An example to illustrate: T1 wants to delete record1, T2 and T3 want to update record1.
a) T1 locks record1
b) T2 and T3 have to wait until record1 is unlocked
c) T1 deletes record1
When using notify:
d) T1 unlocks record1 --> 1 waiting thread (in this example T2) is notified
e) T2 wakes up, sees that record1 doesn't exist anymore and throws a RNFE
f) T3 still waits for record1 to be unlocked, but that will never happen again (because it's deleted) and your program will never finish
When using notifyAll:
d) T1 unlocks record1 --> all waiting threads are notified
e) T2 wakes up, sees that record1 doesn't exist anymore and throws a RNFE
f) T3 wakes up, sees that record1 doesn't exist anymore and throws a RNFE
g) your program runs to completion without any problem