For synchronization, you may use some form of mutual exclusion so that only one thread at a time is manipulating the object.
Dealing with priorities, you will probably want a priority queue with a comparator for determining the criteria for which type of request has greater priority.
Each object would accept a request to do an action and it would have a priority associated with it, and an action (like you suggested with the command pattern). Using a locking mechanism, it would update the priority queue by adding the record, then release it. It must lock the queue because it is accessed via multiple threads. No explicit sorting is necessary -- the queue is always in order of highest priority. Therefore to process a command, simply get the first item in the queue, if one is available, and execute the action.