Single threading: the single-threaded model assumes a single thread of execution in a process, further assuming that COM data structures in a process need no access serialization.
Apartment threading : a COM object is associated with a the thread that created it. Calls to an object on another thread must be executed by the thread that created that object. To accomplish this, the source thread invokes a client proxy which marshals the method call and delivers it to a server stub function in the destination thread via the Win32 message queue associated with the destination thread.
Free threading: COM objects are assumed to be thread-safe, Multiple threads are allowed access to any object in the process with no serialization imposed.
Active Directory does not assume any particular threading model. Provider writers should assume the Free threading model and manage access to their internal data structures accordingly. Provider writers must guarantee the consistency of their internal data structures by protecting them from thread-unsafe (e.g. uncoordinated) update through the use of synchronization objects such as Critical Sections, semaphores, etc. Active Directory clients that use multi-threading must assume that two threads may access the same Active Directory object. These applications should initialize COM for free threading (COINIT_MULTITHREADED) and provide their own access serialization for Active Directory objects that they instantiate using synchronization objects.