1)同一时间只能有一条线程执行固定类的同步方法,但是对于类的非同步方法,可以多条线程 同时访问。所以,这样就有问题了,可能线程A在执行Hashtable的put方法添加数据,线程B 则可以正常调用size()方法读取Hashtable中当前元素的个数,那读取到的值可能不是最新 的,可能线程A添加了完了数据,但是没有对size++,线程B就已经读取size了,那么对于线 程B来说读取到的size一定是不准确的。而给size()方法加了同步之后,意味着线程B调用 size()方法只有在线程A调用put方法完毕之后才可以调用,这样就保证了线程安全性
2)CPU执行代码,执行的不是Java代码,这点很关键,一定得记住。Java代码最终是被翻译 成机器码执行的,机器码才是真正可以和硬件电路交互的代码。即使你看到Java代码只有一 行,甚至你看到Java代码编译之后生成的字节码也只有一行,也不意味着对于底层来说这句语 句的操作只有一个。一句"return count"假设被翻译成了三句汇编语句执行,一句汇编语句和 其机器码做对应,完全可能执行完第一句,线程就切换了。