1,什么是线程安全 (参考书:https://book.douban.com/subject/10484692/)
不对共享变量进行修改
2,都说String是不可变的,为什么我可以这样做呢
   String a = "1";
   a = "2";
   a只是一个引用 当a=2时候 a指向a=2 此时 a=1照样在内存中并没有改变。
3,HashMap的实现原理
   jdk1.7   数组+链表
   jdk1.8   数据+链表+红黑树
4,写出三种单例模式,如果能考虑线程安全最好
   /**
 * 描述:单利模式
 *
 * @author 
 * @create 2018-05-02 15:18
 */
public class Singleton {


    /**
     * 懒汉模式
     */
   private static final Singleton singleton = new Singleton();
    public static Singleton getInstance() {
        return singleton;
    }


    /**
     * 双重校验
     */
    private  static volatile    Singleton  singleton1 ;
    public static  Singleton getInstance1(){
        if (null == singleton1) {
            synchronized (Singleton.class) {
                if (null == singleton1) {
                    return new Singleton();
                }
            }
        }
        return singleton1;
    }


    /**
     * 静态内部类
     */
    private static class LazyHolder {
        private static final Singleton INSTANCE = new Singleton();
    }
    public static final Singleton getInstance2() {
        return LazyHolder.INSTANCE;
    }
5,ArrayList和LinkedList有什么区别
ArrayList的实现用的是数组,LinkedList是基于链表,ArrayList适合查找,LinkedList适合增删
6,实现线程的2种方式
1、继承Thread类创建线程 2、实现Runnable接口创建线程
7,JVM的内存结构
JVM内存结构主要有三大块:堆内存、方法区和栈。堆内存是JVM中最大的一块由年轻代和老年代组成,而年轻代内存又被分成三部分,Eden空间、From Survivor空间、To Survivor空间,默认情况下年轻代按照8:1:1的比例来分配;
8,Lock与Synchronized的区别
Synchronized Java的关键字,在jvm层面上实现通过对象头的监入监出 ,锁的释放是以获取锁的线程执行完同步代码,释放锁 线程执行发生异常,jvm会让线程释放锁假设A线程获得锁,B线程等待。如果A线程阻塞,B线程会一直等待,无法获取锁的状态
可重入 不可中断 非公平
Lock 是一个类 在finally中必须释放锁,不然容易造成线程死锁、  可以判断锁的状态
9,数据库隔离级别有哪些,各自的含义是什么,MYSQL默认的隔离级别是是什么。
  1.READ UNCIMMITTED(未提交读)
  2.READ COMMITTED(提交读)
 3.REPEATABLE READ(可重复读)
 4.SERIALIZABLE(可串行化)
  默认是可重复读
10,请解释如下jvm参数的含义:
-server -Xms512m -Xmx512m -Xss1024K 
-XX:PermSize=256m -XX:MaxPermSize=512m -XX:MaxTenuringThreshold=20 XX:CMSInitiatingOccupancyFraction=80 -XX:+UseCMSInitiatingOccupancyOnly。
-Xms512m JVM最小内存
-Xmx512m JVM最大内存
-Xss1024K 每个线程的堆栈大小
-XX:PermSize=256m  表示非堆区初始内存分配大小,其缩写为permanent size(持久化内存)
XX:MaxPermSize=512m 表示对非堆区分配的内存的最大上限。
-XX:MaxTenuringThreshold=20 对象年龄标记次数
XX:CMSInitiatingOccupancyFraction 是指设定CMS在对内存占用率达到80%的时候开始GC(因为CMS会有浮动垃圾,所以一般都较早启动GC);
-XX:+UseCMSInitiatingOccupancyOnly 只是用设定的回收阈值(上面指定的70%),如果不指定,JVM仅在第一次使用设定值,后续则自动调整.