请高手指教,学习JDK原码时发现的问题

binny 2003-10-30 05:12:16
java.util.Locale类中的writeObject方法

private void writeObject(ObjectOutputStream out) throws IOException {
// hashcode is semantically transient. We couldn't define it as transient
// because versions of this class that DIDN'T declare it as transient have
// already shipped. What we're doing here is making sure that the written-out
// version of hashcode is always -1, regardless of what's really stored there
// (we hold onto the original value just in case someone might want it again).
// Writing -1 ensures that version 1.1 Locales will always recalculate their
// hash codes after being streamed back in. This is necessary because
// String.hashCode() calculates its hash code differently in 1.2 than it did
// in 1.1.
int temp = hashcode;
hashcode = -1; //<--这里
out.defaultWriteObject();
hashcode = temp;
}

如果运行到hashcode = -1;而out.defaultWriteObject();没有运行到的时候。有别的进程调用hashcode();方法

public synchronized int hashCode() {
if (hashcode == -1) {
hashcode =
language.hashCode() ^
country.hashCode() ^
variant.hashCode();
}
return hashcode;
}

这样写文件中的hashcode 不就不是-1了吗。

是不是应该这样写呢

synchronized(hashcode) {
int temp = hashcode;
hashcode = -1;
out.defaultWriteObject();
hashcode = temp;
}

小弟一时想到的,不知道对不对,请高手指教

...全文
30 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
awfe 2003-11-21
  • 打赏
  • 举报
回复
up
binny 2003-11-03
  • 打赏
  • 举报
回复
TO:albberk(山山) 能不能说得再明白点,我不理解你的观点,我是个笨学生,:P。

TO:seace(飞鹤) 这个我没注意到,谢谢。对于这个问题,你有什么好的方法吗?

前两天看JDK的原码,感觉有的地方写的不是很合适,但是不敢肯定。上个周末看了《java与模式》前几章,发现原来jdk中也有不正确的地方。

所以现在才敢怀疑JDK ^_^

大家有什么想法观点尽管说,共同学习
seace 2003-11-02
  • 打赏
  • 举报
回复
To binny:
你以下的写法是不正确的:synchronized(hashcode) {
int temp = hashcode;
hashcode = -1;
out.defaultWriteObject();
hashcode = temp;
}
因为synchronized程序块只能对对象的访问进行同步,基本类型是不允许的。而hashcode 是整型的基本类型。你再看看相关的资料
albberk 2003-10-31
  • 打赏
  • 举报
回复
这个你肯定的用同步机制啊,负责怎么能行呢,这是对这几个数据结构(链表、队列、堆栈)在JAVA中应用时所提出的要求啊,其应用方式和多线程一个道理,你必须对你所操作的这些类型的数据结构保持同步,否则会出现这样的逻辑错误————运行结果和你的初始目标不一样!!!!!明白吗?
我时个教JAVA的语言老师,类似的问题学生经常问到
seace 2003-10-31
  • 打赏
  • 举报
回复
有道理,这个方法我没用过,不知道多个线程是否可能这样来调用你所说的方法
但从方法本身来说,多线程的调用,有可能会引起数据的出错,如你所说。这也是锁定(synchronized标志)提出来的原因。
okwuzhijun 2003-10-31
  • 打赏
  • 举报
回复
我现在用不到我不管它
hyhu 2003-10-31
  • 打赏
  • 举报
回复
太深奥了!up
binny 2003-10-31
  • 打赏
  • 举报
回复
不是静态的

但是Locale的一个实例不能有两个引用同时属于两个线程吗?

如果其中一个调用了hashCode()

同时另一个writeObject()

不就会出错了吗
fast_time 2003-10-30
  • 打赏
  • 举报
回复
这是静态方法吗??

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧