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仅在第一次使用设定值,后续则自动调整.