An empty array can be used in thread synchronization when the goal is to use the least amount of memory for a locking object. Recall that arrays are objects, so if you wish to synchronize multiple threads on a single dummy object, the smallest object you can utilize is an empty array (possibly byte size):
byte bLock = new byte[0];
// Thread T1 synchronizes on this empty array object
synchronize(bLock) {
// perform some task while blocking other threads
// synchronizing on bLock
}