9.69. Hashtable 的 size() 方法为什么要做同步
这是我之前的一个困惑,不知道大家有没有想过这个问题。某个方法中如果有多条语句,并且都在操作同一个类变量,那么在多线程环境下不加锁,势必会引发线程安全问题,这很好理解,但是 size() 方法明明只有一条语句,为什么还要加锁?
关于这个问题,在慢慢地工作、学习中,有了理解,主要原因有两点:
- 同一时间只能有一条线程执行固定类的同步方法,但是对于类的非同步方法,可以多条线程同时访问。所以,这样就有问题了,可能线程A在执行 Hashtable 的 put 方法添加数据,线程B则可以正常调用 size() 方法读取 Hashtable 中当前元素的个数,那读取到的值可能不是最新的,可能线程A添加了完了数据,但是没有对 size++,线程B就已经读取 size 了,那么对于线程B来说读取到的 size 一定是不准确的。而给 size() 方法加了同步之后,意味着线程 B 调用 size() 方法只有在线程A调用put方法完毕之后才可以调用,这样就保证了线程安全性
- CPU 执行代码,执行的不是 Java 代码,这点很关键,一定得记住。Java 代码最终是被翻译成机器码执行的,机器码才是真正可以和硬件电路交互的代码。即使你看到Java 代码只有一行,甚至你看到 Java 代码编译之后生成的字节码也只有一行,也不意味着对于底层来说这句语句的操作只有一个。一句 return count 假设被翻译成了三句汇编语句执行,一句汇编语句和其机器码做对应,完全可能执行完第一句,线程就切换了。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论