The first solution has a couple of hidden difficulties. How does the system know what information is shared and what isn’t? After all, it has no way of figuring this out unless it uses a global monitor that tracks all memory activity. That would be awfully expensive. So if the system designer adopted the “anything goes” position, the assumption has to be that every memory access reaches something which might be shared; then we cannot cache it. We just argued that haying truly independent cache memories is inconsistent with the “anything goes” philosophy. If we trust the programmers to tell us correctly what is shared and what is not the shared, we could mark the shared things and cache the others. This design approach follows the “nothing illegal” philosophy.