I had another thought. If the main issue is receiving garbage data, it should be possible somehow to detect when this occurs and try again. The first thing that comes to mind is:
SimpleVector a,b;
do
{
a = new SimpleVector( myObject.getTransformedCenter() );
b = new SimpleVector( myObject.getTransformedCenter() );
}while( !a.equals( b ) );
If a change occured in the middle of one of the calls to getTransformedCenter() and garbage results were received, then the two results would not be equal. There is probably an error in my logic, but it seems reasonable
Also, I was wondering about the double-buffer concept you mentioned. Even if you were getting the data from a seperate buffer, wouldn't it still be possible that the seperate buffer was getting updated during the attempt to retrieve it's contents, and thus you would get garbage results? Of course, in the example you indicated that you are queueing changes to be made after rendering is complete (I haven't looked at the example, but I assume the shadow copy is getting "locked" until you are finished changing it, so the other thread doesn't try and read from it while it is being changed). Unfortunately I can't use a locking mechanism in my application, because this would be for the SoundManager, and I can't require users to make changes to their programs.
My concern is that, the way SoundManager works now, the user calls the "tick()" method every frame from the rendering thread, but this could result in lag if the user creates many sources that must all be looped through each frame (ex. when the camera is translating - all sources must be re-sorted by distance from listener).
I suppose I could design the class so it breaks the work down into smaller chunks if there are too many sources, to essentially emulate what happens when using a seperate thread.
OR WAIT - I just had a thought -- I could calculate only the source distances in the tick() method, and store them in a second buffer (and I could lock elements while they are being updated). THEN I do the sorting and culling on a seperate thread... That might just work!
Anyway, thanks for the discussion -- given me a lot to think about.