java常见知识点

java源程序先经过javac编译器编译成二进制的.class字节码文件(跨平台指的是.class字节码文件的跨平台,.class字节码文件是与平台无关的),class文件运行在jvm上,java解释器(jvm的一部分)会将其解释成对应平台的机器码执行。不同平台上的jvm不同,而在不同平台上生成的class文件都是一样的,而class文件再由对应平台的jvm解释成对应平台的机器码执行。

JRE顾名思义是java运行时环境,包含了java虚拟机,java基础类库。是使用java语言编写的程序运行所需要的软件环境,是提供给想运行java程序的用户使用的。

JDK顾名思义是java开发工具包,是程序员使用java语言编写java程序所需的开发工具包,是提供给程序员使用的。JDK包含了JRE,同时还包含了编译java源码的编译器javac,还包含了很多java程序调试和分析的工具:jconsole,jvisualvm等工具软件,还包含了java程序编写所需的文档和demo例子程序。

如果你需要运行java程序,只需安装JRE就可以了。如果你需要编写java程序,需要安装JDK。

HashMap最多只允许一条记录的键为null,允许多条记录的值为null,HashMap非线程安全,即任一时刻可以有多个线程同时写HashMap,可能会导致数据不一致。

在hashmap 做put 操作的时候,假如A线程和B线程同时对同一个数组位置调用addEntry,两个线程会同时得到现在的头结点,然后A写入新的头结点之后,B也写入新的头结点,那B的写入操作就会覆盖A的写入操作造成A的写入操作丢失。同理,当多线程对同一数组位置进行remove操作时也会产生覆盖。

CHM适用于读者数量超过写者时,当写者数量大于等于读者时,CHM的性能是低于Hashtable和synchronized Map的。这是因为当锁住了整个Map时,读操作要等待对同一部分执行写操作的线程结束。CHM适用于做cache,在程序启动时初始化,之后可以被多个请求线程访问。正如Javadoc说明的那样,CHM是HashTable一个很好的替代,但要记住,CHM的比HashTable的同步性稍弱。

总结:

• CHM允许并发的读和线程安全的更新操作

• 在执行写操作时,CHM只锁住部分的Map

• 并发的更新是通过内部根据并发级别将Map分割成小部分实现的

• 高的并发级别会造成时间和空间的浪费,低的并发级别在写线程多时会引起线程间的竞争

• CHM的所有操作都是线程安全

• CHM返回的迭代器是弱一致性,fail-safe并且不会抛出ConcurrentModificationException异常

• CHM不允许null的键值

• 可以使用CHM代替HashTable,但要记住CHM不会锁住整个Map

你可能感兴趣的:(java常见知识点)