分享

java高级技术的一些面试总结

 pieryon 2017-11-20
1,volatile变量能不能保证原子性?只能保证可见性,不能保证有序性(原子性)
2,可不可能几个线程同时写volatile变量,多核cpu如何处理同时访问同一个内存块,volatile会直接访问内存,而不经过缓存?可以,不行
3,volatile 能否用来实现同步?
volatile同样也是Java同步的一种方法,只不过和synchronized锁相比,稍弱了点,它只能保证多线程执行的可见性,可不能保证有序性。
它的原理是不需要从主内存中复制一份副本到工作内存,而是直接对主内存的数据进行修改,这样,其他线程都能立马看到数据的修改。因此,volatile的使用范围要臂synchronized小,常用于直接赋值的情况,诸如以下例子的情况就是不适用的。

举个例子1,现有一变量x=10,a线程执行x=x+1操作,b线程执行x=x-1操作,俩线程同时运行的时候,x的值是不确定的,有可能为9,也有可能为11,这就是多线程并发执行的顺序是不可预见导致的,所以要使线程安全,要保证a线程和b线程的有序执行,且执行的操作必须为原子操作。

原子操作:在多线程访问共享资源时,能够确保所有其他的进程(线程)都不在同一时间内访问相同的资源。原子操作(atomic operation)是不需要synchronized,这是Java多线程编程的老生常谈了。所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另一个线程)。
volatile对int和double的修饰也是不同的,对int只需要一步操作,对double需要两步操作。

4,什么时候用volatile?多线程下你不在乎volatile变量的值是什么,只在乎它有没有变化的场景


问:方法内部,如何实现更好的异步?
答:java多线程实现方式主要有三种:继承Thread类、实现Runable接口、使用ExecutorService、CallBack、Future实现有返回结果的多线程。其中前两种现成执行完是没有返回值的,第三种才有返回值。

1.abstract class 在Java中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。
2.在abstract class 中可以有自己的数据成员,也可以有非abstarct的方法,而在interface中,只能够有静态的不能被修改的数据成员(也就是必须是static final的,不过在 interface中一般不定义数据成员),所有的方法都是public abstract的。
3.抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。接口中定义的变量默认是public static final 型,且必须给其赋初值,所以实现类中不能重新定义,也不能改变其值。
4.abstract class和interface所反映出的设计理念不同。其实abstract class表示的是"is-a"关系,interface表示的是"like-a"关系。 
5.实现抽象类和接口的类必须实现其中的所有方法。抽象类中可以有非抽象方法。接口中则不能有实现方法。
abstract class 和 interface 是 Java语言中的两种定义抽象类的方式,它们之间有很大的相似性。但是对于它们的选择却又往往反映出对于问题领域中的概念本质的理解、对于设计意图的反映是否正确、合理,因为它们表现了概念间的不同的关系。

常见的5类运行时异常:
ClassCastException
NullPointerException
ArithmeticException
StringIndexOutOfBoundsException
NegativeArraySizeException

为啥没有全局变量
全局变量是全局可见的,Java不支持全局可见的变量,因为:全局变量破坏了引用透明性原则。全局变量导致了命名空间的冲突。

实现线程安全的三种方式:被volatile、synchronized等关键字修饰,或者使用java.util.concurrent下面的类库。

transient 变量不会进行序列化。
例如一个实现 Serializable 接口的类在序列化到 ObjectStream 的时候,transient 类型的变量不会被写入流中,同时,反序列化回来的时候,对应变量的值为 null。

一个方法可能是static并且是synchronized的吗?
可以。如果这样做的话,JVM 会获取和这个对象关联的 java.lang.Class 实例上的锁。
这样做等于:
synchronized(XYZ.class) {
}


SpringMVC注解框架的理解:
1、SpringMVC是一个基于注解型的MVC框架,他的核心控制器是dispatcherServlet,在web.xml中配置。用户发起的请求都会被核心控制器拦截,进入SpringMVC的核心配置文件spring-servlet.xml。在这个xml文件中,主要配置的是注解的开启和扫描信息。首先要开启注解模式,annotation-driven。并且指定注解所在的路径,通过component-scan标签的base-package来设置,当请求到达后,SpringMVC会根据请求的action名称,通过ActionMapping去找到对应的action类中的requestMapping注解,这个注解中有一个value值,需要与请求的名称保持一致。所以请求可以到达action层。当然,SpringMVC也有自己的拦截器Interceptor。

2、另外SpringMVC的验证也是一个亮点,支持JSR303处理ajax的请求更是方便,只需要一个注解@ResponseBody,然后直接返回响应文本即可,

3、在Java代码中使用@AutoWired或@Resource注解方式进行装配,这两个注解的区别是:@AutoWired默认按类型装配,@Resource默认按名称装配,当找不到与名称匹配的bean才会按类型装配;


SpringMVC与Struts2的区别:
SpringMVC是基于方法开发的,通过方法里的参数来接取前台传来的值,而Struts2是基于类开发的,通过声明全局的私有属性并生成get、set方法来接受前台传递过来的参数值。
SpringMVC默认单例,线程不安全,即针对所有请求只创建一个实例;Struts2默认是原型,线程安全,即对于每个请求都会创建一个新的实例,所以SpringMVC比Struts2性能高。
SpringMVC是基于注解型的MVC框架,其核心控制器是DispatcherServlet,它的入口是Servlet;Struts2是基于MVC实现的,其核心控制器是StrutsPrepareAndExecuteFilter,它的入口是Filter。
Struts2有自己自带的拦截器,SpringMVC也可以配置拦截器拦截。
intercepter的实现机制:Struts2有以自己的interceptor机制,SpringMVC用的是独立的AOP方式。这样导致Struts2的配置文件量还是比SpringMVC大,虽然Struts2的配置能继承;所以我觉得从使用上来讲,SpringMVC使用更加简洁,开发效率SpringMVC确实比Struts2高。
SpringMVC是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应,所以说从架构本身上spring3MVC就容易实现restful  url。Struts2是类级别的拦截,一个类对应一个request上下文;实现restful  url要费劲,因为Struts2action的一个方法可以对应一个url;而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了。
SpringMVC的方法之间基本上独立的,独享request、response数据,请求数据通过参数获取,处理结果通过modelMap交回给框架方法之间不共享变量;而Struts2就比较乱,虽然方法之间也是独立的,但其所有Action变量是共享的,这不会影响程序运行,却给我们编码,读程序时带来麻烦。

mybaitis与hibernate的比较及应用场景

2.1:mybatis的特点:

1:学习门槛低,学习成本低。只要有sql基础。就可以学习mybatis了,而且还很容易上手

2:通过直接编写sql语句,可以直接对sql进行性能的优化

3:由于sql语句是直接编写的,所以灵活性很高多变。便于代码的维护

4:缺点。有用sql是直接编写的。如果sql语句写的不是通用的,那么移植到其他数据库(如mysql/sqlserver/oracle)的时候需要修改sql语句的。一句话,可移植性不好

2.2:hibernate的特点:

1:标准的ORM框架,开发者不需要编写sql语句。(HQL语句可以直接完成)

2:可移植性好。因为使用的是HQL语句。具有很好的数据库无关性。当迁移数据库后,不需要再次编写代码

3:学习门槛高。需要对数据库关系模型有良好的基础,而且在设置OR映射的时候需要考虑好性能和对象模型的权衡。

4:缺点。因为使用的是HQL语句,开发者不需要编写sql语句。所以想要对sql进行性能优化的时候,就麻烦了。

2.3:mybaits的应用场景

因其sql可以自己编写及其轻量级框架,所以在需求多变的互联网项目中应用的较为广泛。

比如:电商项目多是用mybatis的

2.4:hibernate的应用场景

需求明确、业务固定的项目。例如OA项目、ERP项目等。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多