The PhantomData prevents any MyFFI object from crossing a thread boundary, and MyFFI::get() ensures that only one MyFFI instance is ever created. In your example, you're creating that instance on the spawned thread instead of the main one, which is still a form of single-threaded operation.