Several notions of consistency have been proposed to provide a consistent view of the shared memory. A consistency notion imposes constraints on the order in which updates to shared variables are made visible to various processes. We classify such constraints as intra-process constraints and many existing consistency notions provide flexible mechanisms to specify such constraints. We may also need to specify inter-process constraints to restrict the sequence in which updates issued by different processes are made visible. We propose the notion of invariant consistency that allows specification of such interprocess synchronization constraints. For this propose, we allow a programmer to label program operations and specify an invariant I constraining the execution of labeled operations at different processes. The implementation of invariant consistency ensures that the labeled operations are made visible in an order that satisfies I. We also give an implementation of invariant consistency that involves a mechanical translation of invariants to synchronization code. We show that invariant consistency simplifies programming as it eliminates application-level synchronization code to enforce inter-process constraints.