Threads do not have separate address spaces inside the same process; instead, they are lightweight, share resources, and can be scheduled independently. One of the main features of threads that makes data sharing and effective communication between threads in a process possible is their shared address space.