对java synchronized 关键字的理解二

来源:互联网 发布:麻将游戏app开发 源码 编辑:程序博客网 时间:2024/09/21 09:28

近日,有位同事写了一段线程同步代码,却发现实际上没有启作用。上代码

public String getSerialNo(String requestId) throws ServiceException {
    String serialNo = "";
try {
synchronized(requestId) {
//------------业务逻辑处理
}
} catch (DaoException e) {
throw new ServiceException("getSerialNo DaoException" , e);
}
return serialNo;
}
看上去,第一感觉这个是调用传的对象问题,就是String 对象不是同一个。这就又牵涉到String对象生成的问题了,上篇文章中其中有提到

http://blog.csdn.net/yysct2005/article/details/8876906

那就顺着这个思路来吧,这个方法的调用方呢?经了解得知,这是一个远程方法调用的实现类的接口调用。这也就牵涉到序列化实现机制了,使用的是Hessian2序列化。

那也就成了对同一个值相等的String对象,序列化生成的String是怎么生成的问题。

总之,说明了,同步加在了不同的对象上面导致的问题。

这么多场景下(在不知外部系统怎么来调用),怎么更好滴使用同步关键字,有好的实践方式:

封闭原则-----此类代码同步仅限于本类实现。对外部透明,并不依赖外部。

对象的锁建议选定new Object 方式。


0 0
原创粉丝点击