Synchronize on value, not object

java, synchronized, thread-safety

Solution

If the set of user ids is limited, you can synchronize on an interned version of the `String`.

Either use `String.intern()` (which has a few drawbacks) or something like Guava `Interners` if you need a bit more control over the interning.

Problem

I want to do something like this in Java ``` public void giveMoney(String userId, int money) { synchronized (userId) { Profile p = fetchProfileFromDB(userId); p.setMoney(p.getMoney() + userId); saveProfileToDB(p); } } ``` But of course, synchronizing on a string is not correct. What's a correct way to do something like this?

Original source

Related problems