对java synchronized 关键字的理解二

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

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 方式。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值