我想在多个API请求上锁定一个对象,这样每个用户只有一个请求可以进入一个代码块。
synchronized(obj)
是根据对象的引用还是它的hashCode()
函数锁定的?
例如,我可以这样做吗:
synchronized("asdf") {
doSomethingNifty();
}
这里的"asdf“有一个唯一的散列,但没有唯一的引用。
发布于 2013-05-22 00:32:47
你正在同步一个对象,内存地址问题纯粹是一个实现问题,与你无关。只要它是相同的对象(指完全相同的实例),同步就完成了。
如果您使用不同的实例,同步将不起作用。你能做的就是定义一个公共静态常量作为锁:
public final static Object LOCK = new Object();
并使用它
synchronized(SomeClass.LOCK) {
发布于 2013-05-22 00:33:40
锁在对象本身的实例上,如果你想这样想的话,你可以把它看作内存位置。所以你的建议是行不通的。
相反,听起来你只需要有一个与你想要保护的代码块相对应的对象。因此,在您的程序的安装过程中,您需要如下内容
static Object lockObject = new Object();
然后你就可以
synchronized(lockObject) {
doSomethingNifty();
}
但是,如果doSomethingNifty()与特定的对象相关,那么使用该对象而不是lockObject将非常有意义。还要确保doSomethingNifty()的执行速度很快,否则会有很多用户等待。
https://stackoverflow.com/questions/16675005
复制相似问题