`
ymm8505
  • 浏览: 32296 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

面试笔记

阅读更多
最近电商足足的火爆了一把、看样子还有一段日子要火爆、互联网金融也不甘落后……
复习了之前学习的Spring、Hibernate、SpringMVC、Mybatis等框架。
又对目前电商分布式架构略作研究、投出了几分简历,去面试了几把。
在这里总结总结查缺补漏分享给大家:


第一天是一个JD充值组的面试有两个小伙子看着就像是搞技术的。聊的还可以最后还没给消息
============================================================
集合:set\list  有啥区别 set允许有空值吗?为什么不允许?
      List和Set都是接口。他们各自有自己的实现类,有无顺序的实现类,也有有顺序的实现类。
最大的不同就是List是可以重复的。而Set是不能重复的。
List适合经常追加数据,插入,删除数据。但随即取数效率比较低。
Set适合经常地随即储存,插入,删除。但是在遍历时效率比较低。

        hashMap的key可以是引用类型吗?
        可以是引用类型,但是有隐患,不建议使用引用类型。
--------------------------------------------------------------
事务的传播特性:
有7种,工作中经常用到的只有两种:require、supports
1. PROPAGATION_REQUIRED: 如果存在一个事务,则支持当前事务。如果没有事务则开启
2. PROPAGATION_SUPPORTS: 如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行
3. PROPAGATION_MANDATORY: 如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。
4. PROPAGATION_REQUIRES_NEW: 总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。
5. PROPAGATION_NOT_SUPPORTED: 总是非事务地执行,并挂起任何存在的事务。
6. PROPAGATION_NEVER: 总是非事务地执行,如果存在一个活动事务,则抛出异常
7. PROPAGATION_NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中. 如果没有活动事务, 则按TransactionDefinition.PROPAGATION_REQUIRED 属性执行
---------------------------------------------------------------
线程的两种创建方式: extends Thread、implements Runnable
  Thread源码:public class Thread implements Runnable
所以说Thread本质还是implements Runnable来创建线程。不过Runnable是一个接口只有一个run方法。我们还不能直接去调用run方法。需要调用Start()方法来启动线程,等CPU用时间的时候安排时间来执行Run()方法。

-------------------------------------------------
线程池的创建方式:
我们的项目中用的是这种:
    Scheduled Thread Pool: 线程池可以对线程执行的时间和顺序做预先指定。比如说要某些线程在某个时候才启动或者每隔多长时间就启动一次。有点像我们的Timer Job。使用Executors.newScheduledThreadPool()创建。

另外几种:
    Single Thread Executor: 创建的线程只包含一个线程,所有提交到线程池的线程会按照提交的顺序一个接一个的执行。
通过Executors.newSingleThreadExecutor()方法创建。这种线程池适用于我们只希望每次使用一个线程的情况。
    Cached Thread Pool: 线程池里会创建尽可能多的必须线程来并行执行。一旦前面的线程执行结束后可以被重复使用。当然,使用这种线程池的时候我们必须要小心。我们使用多线程的目的是希望能够提高并行度和效率,但是并不是线程越多就越好。如果我们设定的线程数目过多的时候,使用Cached Thread Pool并不是一个很理想的选择。因为一方面它占用了大量的线程资源,同时线程之间互相切换很频繁的时候也会带来执行效率的下降。它主要适用于使用的线程数目不多,但是对线程有比较灵活动态的要求。一般通过Executors.newCachedThreadPool()来创建。
    Fix Thread Pool: 线程池里会创建固定数量的线程。在线程都被使用之后,后续申请使用的线程都会被阻塞在那里。使用Executors.newFixedThreadPool()创建。
我项目中用的就是这种固定大小的线程。

------------------------------------------------------------
保持线程同步的几种方法:
  synchronized、Volition
1.同步方法
    即有synchronized关键字修饰的方法。
    由于java的每个对象都有一个内置锁,当用此关键字修饰方法时,
    内置锁会保护整个方法。在调用该方法前,需要获得内置锁,否则就处于阻塞状态。

2、同步代码块
3、使用特殊域变量(volatile)实现线程同步
    a.volatile关键字为域变量的访问提供了一种免锁机制,
    b.使用volatile修饰域相当于告诉虚拟机该域可能会被其他线程更新,
    c.因此每次使用该域就要重新计算,而不是使用寄存器中的值
    d.volatile不会提供任何原子操作,它也不能用来修饰final类型的变量
4、使用重入锁实现线程同步
    在JavaSE5.0中新增了一个java.util.concurrent包来支持同步。
    ReentrantLock类是可重入、互斥、实现了Lock接口的锁,
    它与使用synchronized方法和快具有相同的基本行为和语义,并且扩展了其能力
     ReenreantLock类的常用方法有:
        ReentrantLock() : 创建一个ReentrantLock实例
        lock() : 获得锁
        unlock() : 释放锁
5.使用局部变量实现线程同步
    如果使用ThreadLocal管理变量,则每一个使用该变量的线程都获得该变量的副本,
    副本之间相互独立,这样每一个线程都可以随意修改自己的变量副本,而不会对其他线程产生影响。
    ThreadLocal 类的常用方法
    ThreadLocal() : 创建一个线程本地变量
    get() : 返回此线程局部变量的当前线程副本中的值
    initialValue() : 返回此线程局部变量的当前线程的"初始值"
    set(T value) : 将此线程局部变量的当前线程副本中的值设置为value

-------------------------------------------------------------
如何创建一个带返回值的线程:

【转】、使用ExecutorService、Callable、Future实现有返回结果的多线程
ExecutorService、Callable、Future这个对象实际上都是属于Executor框架中的功能类。想要详细了解Executor框架的可以访问http://www.javaeye.com/topic/366591 ,这里面对该框架做了很详细的解释。返回结果的线程是在JDK1.5中引入的新特征,确实很实用,有了这种特征我就不需要再为了得到返回值而大费周折了,而且即便实现了也可能漏洞百出。
可返回值的任务必须实现Callable接口,类似的,无返回值的任务必须Runnable接口。执行Callable任务后,可以获取一个Future的对象,在该对象上调用get就可以获取到Callable任务返回的Object了,再结合线程池接口ExecutorService就可以实现传说中有返回结果的多线程了。下面提供了一个完整的有返回结果的多线程测试例子,在JDK1.5下验证过没问题可以直接使用。
-------------------------------------------------
垃圾收集器:有几种策略 你怎么知道这个对象要被收回。
1、引用计数算法   对象有一个引用就+1、不用了就-1 如果为0 就表示可以收回
2、根搜索算法  从GC Roots开始往下搜索、不可达到的对象就可以回收
     GC Roots可以是下面几种:
   1、虚拟机栈(栈帧中的本地变量表)中的引用的对象。
  2、方法区中的类静态属性引用的对象。
  3、方法区中的常量引用的对象。
  4、本地方法栈中JNI(即一般说的Native方法)的引用的对象

【转】http://www.cnblogs.com/gw811/archive/2012/10/19/2730258.html
------------------------------------------------------------------
动态代理、反射用在什么地方:
Spring AOP IOC
----------------------------------------------------------------------
Dubbo一次从注册中心取到地址之后。注册中心不能连接了.客户端还去注册中心取不取地址了。
    注册中心为N+1对等集群,一台挂掉后,会自动切换到另外一台注册中心
    注册中心全部挂掉后,消息消费者本地会缓存服务提供者列表,所以不影响当时的服务调用。
    服务提供者为集群,一台挂掉后,通过心跳过程,注册中心会立即刷到服务消费者告知;

----------------------------------------------------------------------
dubbo的选举机制、以及支持的协议。
Dubbo协议、Rmi协议、Hessian协议
API文档位置:
http://dubbo.io/User+Guide-zh.htm#UserGuide-zh-dubbo%253A%252F%252F

--------------------------------------------------------------------
dubbo的 服务器集群节点如果有挂掉的是服务器端自己先发现的,还是等client连接请求过来以后发现的。
    注册中心通过长连接感知服务提供者的存在,服务提供者宕机,注册中心将立即推送事件通知消费者
----------------------------------------------------------------------
jdom 和dom4j 解析XML 是否一次把xml文件全部加入到内存
dom是一次性把XML文件载入到内存。
----------------------------------------------------------------------
JVM的理解
http://www.cnblogs.com/gw811/archive/2012/10/18/2730117.html
-------------------------------------------------------------------
自己实现一个注解
慕课网有一个视频自己去搜索一下
===============================================================
3
1
分享到:
评论
2 楼 ymm8505 2015-11-07  
what are you 弄啥哩?
1 楼 tianxiyue 2015-11-07  
    

相关推荐

Global site tag (gtag.js) - Google Analytics