我看到的所有答案都太复杂了。为什么不简单使用:
public void executeInNamedLock(String lockName, Runnable runnable) { synchronized(lockName.intern()) { runnable.run(); }}关键是方法
intern:它确保返回的String是全局唯一对象,因此可以用作vm-instance-wide互斥量。所有的Interned Strings都保存在一个全局池中,因此这就是你在原始问题中所讨论的静态缓存。不用担心内存泄漏;如果没有其他线程引用这些字符串,则这些字符串将被gc’ed。但是请注意,直到(包括Java6)该池都保留在PermGen空间而不是堆中,因此你可能必须增加它。
但是,如果vm中的某些其他代码由于完全不同的原因而锁定在同一字符串上,则会出现一个问题,但是a)这种可能性很小,b)你可以通过引入名称空间来解决它,例如
executeInNamedLock(this.getClass().getName() + "_" + myLockName);



