安全地使用 Java 映射作为互斥量持有者
Using a Java map safely as mutex holder
要求是,方法 A 中的相关代码不能在具有相同 class 的任何对象上并行执行。
下面的伪代码可以吗?
private final Map<String, Object> simpleMutex = new HashMap<>();
public void A( final Object o)
{
final ThreadLocal<Object> myLock = new ThreadLocal<>();
synchronized ( simpleMutex )
{
myLock.set( simpleMutex.computeIfAbsent( o.getClass().getName(), className-> new Object() ) );
}
synchronized ( myLock.get() )
{
System.out.println("Executing A on " + o);
}
}
private final Map<Class<?>, Object> locksMap = new ConcurrentHashMap<>();
public void A(final Object o) {
Object myLock = locksMap.computeIfAbsent(o.getClass(), className -> new Object());
synchronized (myLock) {
System.out.println("Executing A on " + o);
}
}
要求是,方法 A 中的相关代码不能在具有相同 class 的任何对象上并行执行。
下面的伪代码可以吗?
private final Map<String, Object> simpleMutex = new HashMap<>();
public void A( final Object o)
{
final ThreadLocal<Object> myLock = new ThreadLocal<>();
synchronized ( simpleMutex )
{
myLock.set( simpleMutex.computeIfAbsent( o.getClass().getName(), className-> new Object() ) );
}
synchronized ( myLock.get() )
{
System.out.println("Executing A on " + o);
}
}
private final Map<Class<?>, Object> locksMap = new ConcurrentHashMap<>();
public void A(final Object o) {
Object myLock = locksMap.computeIfAbsent(o.getClass(), className -> new Object());
synchronized (myLock) {
System.out.println("Executing A on " + o);
}
}