同一时间只能有一条线程执行固定类的同步方法,但是对于类的非同步方法,可以多条线程同时访问。所以,这样就有问题了。
可能线程 A 在执行 Hashtable 的 put 方法添加数据,线程 B 则可以正常调用 size()方法读取 Hashtable 中当前元素的个数,那读取到的值可能不是最新的,可能线程 A 添加了完了数据,但是没有对 size++,线程 B 就已经读取 size了,那么对于线程 B 来说读取到的 size 一定是不准确的。
而给 size()方法加了同步之后,意味着线程 B 调用 size()方法只有在线程 A 调用 put 方法完毕之后才可以调用,这样就保证了线程安全性CPU 执行代码,执行的不是 Java 代码,这点很关键,一定得记住。
Java 代码最终是被翻译成机器码执行的,机器码才是真正可以和硬件电路交互的代码。即使你看到 Java 代码只有一行,甚至你看到 Java 代码编译之后生成的字节码也只有一行,也不意味着对于底层来说这句语句的操作只有一个。一句”return count”假设被翻译成了三句汇编语句执行,一句汇编语句和其机器码做对应,完全可能执行完第一句,线程就切换了。
相关问题
-
启动线程方法 start()和 run()有什么区别?
1年前 0 305
-
什么是死锁?如何避免死锁?
1年前 0 162
-
Java 内存模型是什么,哪些区域是线程共享的,哪些是不共享的?
1年前 0 354
-
Fork/Join 框架是干什么的?
1年前 0 355
-
为什么 wait 和 notify 方法要在同步块中调用?
1年前 0 127
-
Fork/Join 框架使用有哪些要注意的地方?
1年前 0 152
-
多线程上下文切换是什么意思?
1年前 0 139
-
ReadWriteLock 有什么用?
1年前 0 170
-
多线程同步有哪几种方法?
1年前 0 286
-
什么是 CAS 算法?在多线程中有哪些应用。
1年前 0 290
-
线程中的 wait()和 sleep()方法有什么区别?
1年前 0 290
-
线程 yield()方法有什么用?
1年前 0 265
-
如何创建线程安全的单例模式
1年前 0 151
-
什么是守护线程?有什么用?
1年前 0 257
-
线程数过多会造成什么异常?
1年前 0 143
-
你如何在 Java 中获取线程堆栈?
1年前 0 177
-
常用的几种线程池并讲讲其中的工作原理。
1年前 0 286
-
一个线程的生命周期有哪几种状态?它们之间如何流转的?
1年前 0 283
-
什么是阻塞式方法?
1年前 0 315
-
不可变对象对多线程有什么帮助?
1年前 0 179