InheritableThreadLocal
only helps set the initial value in the child. It does not provide any other synchronization. You have to use normal thread synchronization methods to propagate the value.
That said, if you want all the children to have the same value of the parent both at start and when the parent changes, then why are you giving them all separate objects that need to be synchronized? Why not give the children a reference to the parent and have them all check the parent's value?