Immutability inherently provides thread safety; confinement further ensures it.
Since value objects are immutable, they are inherently thread-safe as their state cannot change. However, ensuring that references to these objects are not leaked unintentionally (confinement) further guarantees thread safety. For example, using a DateRange value object within a method scope avoids unintended sharing.
Additional Notes
How can you ensure thread safety with value objects?