Google for "Java distributed cache" and find some solutions. The Apache JCS is one. There is a JSR in progress to put a distributed cache into the JDK or
J2EE or somewhere, but it hasn't made much progress in recent years.
I think the most common approach is to broadcast a message any time a cached entry is changed using JMS or RMI or sockets or whatever for the message. The other caches in the cluster mark the key invalid so they are forced to retrieve the value from a common store next time somebody asks for it.
The system I'm using synchronizes values in memory across a cluster but they are not backed up by a database or any external persistent store. So they have to send the actual value any time one cache is updated. And I'm not sure how they bring a server that joins the cluster late up to date.