1.什么是线程安全 (参考书:https://book.douban.com/subject/10484692/)
答:线程安全指的是多线程的情况下程序对数据操作,保证数据的可以达到预料的效果
2,都说 String 是不可变的,为什么我可以这样做呢
String a = "1";
a = "2";
答:
String 类有两种实例化形式
一种通过字符串变量,一种通过 new 关键字
这里第二句代码执行的时候,
其实创建了一个新的对象,
然后将 a 这个对象的引用重新指向这个新的对象;
3.HashMap 的实现原理
数组加链表
4.写出三种单例模式,如果能考虑线程安全最好
public class Test {
//例子1
private volatile static Test test;
private Test() {
}
public static Test newInstance() {
if (test == null) {
synchronized (Test.class) {
if (test == null) {
test = new Test();
}
}
}
return test;
}
}
public class Test {
//例子2
private static class TestHolder {
private static Test singleton = new Test();
}
private Test() {
}
public static Test newInstance() {
return TestHolder.singleton;
}
}
public enum Test2 {
//例子3
INSTANCE;
private Test3 instance;
Test2() {
instance = new Test3();
}
public Test3 getInstance() {
return instance;
}
class Test3{
private Test3() {};
}
}
5.ArrayList 和 LinkedList 有什么区别
ArrayList 是实现了基于动态数组的数据结构,所以相对比对于查询数据,速度会比较快
LinkedList 基于链表的数据结构,所以相对比对于数据增加或删除速度会比较快
6.实现线程的 2 种方式
继承 Thread 类,或者实现 Runnable 接口
7.JVM 的内存结构
PC Register(寄存器)
JVM Stack(JVM 栈)
Heap(堆)
MethodArea(方法区)
RuntimeConstant Pool(运行时常量池,方法区的一部分)
NativeMethod Stacks(本地方法堆栈)
8.Lock 与 Synchronized 的区别
一、synchronized 和 lock 的用法区别
用法上的区别:
synchronized:在需要同步的对象中加入此控制,synchronized 可以加在方法上,
也可以加在特定代码块中,
括号中表示需要锁的对象。
lock:需要显示指定起始位置和终止位置。一般使用 ReentrantLock 类做为锁,
多个线程中必须要使用一个 ReentrantLock 类做为对象才能保证锁的生效。
且在加锁和解锁处需要通过 lock()和 unlock()显示指出。一般会在 finally 块中写 unlock()以防死锁。
加锁的机制的区别
synchronized:采用悲观锁
lock:采用乐观锁
性能上的区别:
由于锁机制的区别,所以在线程竞争资源激烈的时候,synchronized 在效率上一定程度低于 lock
9.数据库隔离级别有哪些,各自的含义是什么,MYSQL 默认的隔离级别是是什么。
Serializable (串行化):级别最高,可避免脏读、不可重复读、幻读的发生。
Repeatable read (可重复读):可避免脏读、不可重复读的发生。
Read committed (读已提交):可避免脏读的发生。
Read uncommitted (读未提交):最低级别,任何情况都无法保证。
10.请解释如下 jvm 参数的含义:
-server
-Xms:512m (为 JVM 启动时申请的最小 Heap 内存,默认为物理内存的 1/64 但小于 1G)
-Xmx:512m
(为 JVM 可申请的最大 Heap 内存,默认为物理内存的 1/4,默认当空余堆内存小于 40% 时,JVM 会增大 Heap 的大小到-Xmx 指定的大小,
可通过-XX:MinHeapFreeRatio=来指定这个比例,当空余堆内存大于 70% 时,
JVM 会将 Heap 的大小往-Xms 指定的大小调整,可通过-XX:MaxHeapFreeRatio=来指定这个比例)
-Xss:1024K (jvm 栈内存)
-XX:PermSize=256m (方法区\Hotspot 虚拟机有人称永久代 内存)
-XX:MaxPermSize=512m (方法区\Hotspot 虚拟机有人称永久代 所能获得的最大内存)
-XX:MaxTenuringThreshold=20 (新生代的对象经过几次垃圾回收后(如果还存活),进入老年代。
如果该参数设置为 0,这表示新生代的对象在垃圾回收后,不进入 survivor 区,直接进入老年代)
-XX:CMSInitiatingOccupancyFraction=80 (该值代表老年代堆空间的使用率,
当使用率达到这个数的时候 cms 垃圾回收)
-XX:+UseCMSInitiatingOccupancyOnly
标志来命令 JVM 不基于运行时收集的数据来启动 CMS 垃圾收集周期。而是,当该标志被开启时,
JVM 通过 CMSInitiatingOccupancyFraction 的值进行每一次 CMS 收集,而不仅仅是第一次。
自己的简单回答,哈哈哈,有啥不对的地方,希望得到大家的指正
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于