1、谈谈你对java平台的理解?“java是解释执行”,这句话正确吗?
Java本身是一种面向对象的语言,最显著的特性有两个方面:
1)“书写一次,到处运行”,能够非常容易获得跨平台能力
2) 垃圾回收(GC),Java通过垃圾回收期回收分配内存,大部分情况下,程序员不需要自己操心内存的分配和回收。
2、如何保证容器是线程安全的?ConCurrentHashMap如何实现高效的线程安全?
Java提供了不同层面的线程安全支持,在传统集合框架内部,除了Hashtable等同步容器,还提供了所谓的同步包装器,我们可以调用Collections工具类提供的包装方法,来获取一个同步的包装容器(如Collections.synchronizedMap),但是他们都是利用非常粗粒度的同步方式,在高并发情况下,性能较低。
另外,更加普通的选择是利用并发包提供的线程安全容器类,他提供了:
各种并发容器,比如ConCurrentHashMap、CoptOnWriteArryList。
各种线程安全队列:ArrayBlockingQueue、SynchronousQUeue。
各种有序容器的线程安全版本等。
3、Synchronized代码块是由一对monitorenter/monitorexit指令实现的,Moniter对象时同步的基本实现,在Java之前,Monitor的实现完全是依靠操作系统内部的互斥锁,因为需要进行用户态到内核态的切换,所以同步操作是一个无差别的重量级操作。
现在的JDK中,JVM对此进行了达到阔斧的改进,提供了三种不同的Monitor实现,也就是常说的三种不同的锁:偏向锁、轻量级锁和重量级锁,大大改进了其性能。
所谓锁的升级、降级,就是JVM优化synchronized运行的机制,当JVM检测到不同的竞争状态是,会自动切换到合适的锁实现,也就是切换锁的升级、降级。
没有竞争,默认使用偏向锁,降低无竞争的开销。 如果有另外的线程试图锁定某个已经被偏向过的对象,JVM就要撤销偏向锁,并切换到轻量级锁实现。轻量级锁依赖CAS操作Mark Word 来视图获取锁,如果重试成功,就是用普通的轻量级,否则,进一步升级为重量级锁。
4、设计模式分类:
创建型模式、结构型模式和行为型模式。
创建型包括:工厂、单利、构造器模式(Builder)、原型模式
结构性包括:针对软件设计结构的总结,关注于类、对象继承、组合方式的实践经验。桥接模式、适配器模式、装饰者模式、代理模式、组合模式、外观模式、组合模式、享元模式
行为型模式:策略模式、观察者模式、迭代器模式、模板模式、命令模式等。
5、 java的线程是不允许两次启动的,第二次调用start必然会抛出异常。
线程的声明周期:创建、就绪、运行、阻塞、等待、终止。
6、exception 和error的区别