1,什么是线程安全 (参考书:https://book.douban.com/subject/10484692/)
如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。
2,都说String是不可变的,为什么我可以这样做呢
String a = "1";
a = "2";
答: String a 表示定义一个字符串对象a ,“1” 是一个字符串常量是不可以变的,“2”也是一个字符串常量是不可以变的,a=“2” 表示 "2" 的引用给了 a。
3,HashMap的实现原理
答:HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象。当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会储存在链表的下一个节点中。 HashMap在每个链表节点中储存键值对对象。
4,写出三种单例模式,如果能考虑线程安全最好
第一种(懒汉,线程不安全):
2 private static Singleton instance;
3 private Singleton (){}
4 public static Singleton getInstance() {
5 if (instance == null) {
6 instance = new Singleton();
7 }
8 return instance;
9 }
10 }
11
这种写法lazy loading很明显,但是致命的是在多线程不能正常工作。
第二种(懒汉,线程安全):
2 private static Singleton instance;
3 private Singleton (){}
4 public static synchronized Singleton getInstance() {
5 if (instance == null) {
6 instance = new Singleton();
7 }
8 return instance;
9 }
10 }
11
这种写法能够在多线程中很好的工作,而且看起来它也具备很好的lazy loading,但是,遗憾的是,效率很低,99%情况下不需要同步。
第三种(饿汉):
2 private static Singleton instance = new Singleton();
3 private Singleton (){}
4 public static Singleton getInstance() {
5 return instance;
6 }
7 }
8
这种方式基于classloder机制避免了多线程的同步问题,不过,instance在类装载时就实例化,虽然导致类装载的原因有很多种,在单例模式中大多数都是调用getInstance方法, 但是也不能确定有其他的方式(或者其他的静态方法)导致类装载,这时候初始化instance显然没有达到lazy loading的效果。
第四种(饿汉,变种):
2 private Singleton instance = null;
3 static {
4 instance = new Singleton();
5 }
6 private Singleton (){}
7 public static Singleton getInstance() {
8 return this.instance;
9 }
10 }
11
表面上看起来差别挺大,其实更第三种方式差不多,都是在类初始化即实例化instance。
第五种(静态内部类):
2 private static class SingletonHolder {
3 private static final Singleton INSTANCE = new Singleton();
4 }
5 private Singleton (){}
6 public static final Singleton getInstance() {
7 return SingletonHolder.INSTANCE;
8 }
9 }
10
这种方式同样利用了classloder的机制来保证初始化instance时只有一个线程,它跟第三种和第四种方式不同的是(很细微的差别):第三种和第四种方式是只要Singleton类被装载了,那么instance就会被实例化(没有达到lazy loading效果),而这种方式是Singleton类被装载了,instance不一定被初始化。因为SingletonHolder类没有被主动使用,只有显示通过调用getInstance方法时,才会显示装载SingletonHolder类,从而实例化instance。想象一下,如果实例化instance很消耗资源,我想让他延迟加载,另外一方面,我不希望在Singleton类加载时就实例化,因为我不能确保Singleton类还可能在其他的地方被主动使用从而被加载,那么这个时候实例化instance显然是不合适的。这个时候,这种方式相比第三和第四种方式就显得很合理。
第六种(枚举):
2 INSTANCE;
3 public void whateverMethod() {
4 }
5 }
6
这种方式是Effective Java作者Josh Bloch 提倡的方式,它不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象,可谓是很坚强的壁垒啊,不过,个人认为由于1.5中才加入enum特性,用这种方式写不免让人感觉生疏,在实际工作中,我也很少看见有人这么写过。
第七种(双重校验锁):
2 private volatile static Singleton singleton;
3 private Singleton (){}
4 public static Singleton getSingleton() {
5 if (singleton == null) {
6 synchronized (Singleton.class) {
7 if (singleton == null) {
8 singleton = new Singleton();
9 }
10 }
11 }
12 return singleton;
13 }
14 }
15
5,ArrayList和LinkedList有什么区别
答:ArrayList底层是可变数据,查询快,增删慢
ArrayList底层是链表数据结构,增删快,查询慢
6,实现线程的2种方式
继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程
7,JVM的内存结构
答:堆区,栈区,方法区,寄存器,本地方法区
8,Lock与Synchronized的区别
答:synchronized是在JVM层面实现的,因此系统可以监控锁的释放与否,而ReentrantLock使用 代码实现的,系统无法自动释放锁
9,数据库隔离级别有哪些,各自的含义是什么,MYSQL默认的隔离级别是是什么。
答: 数据库的隔离级别:
① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
② Repeatable read (可重复读):可避免脏读、不可重复读的发生。(mysql默认)
③ Read committed (读已提交):可避免脏读的发生。
④ Read uncommitted (读未提交):最低级别,任何情况都无法保证。
10,请解释如下jvm参数的含义:
-server -Xms512m -Xmx512m -Xss1024K
-XX:PermSize=256m -XX:MaxPermSize=512m -XX:MaxTenuringThreshold=20 XX:CMSInitiatingOccupancyFraction=80 -XX:+UseCMSInitiatingOccupancyOnly。
-Xms512m ( Java能够分配的内存)
-Xmx512m ( JAVA能够分配的最大内存)
-XX:PermSize=512M (非堆内存初始值)
-XX:MaxPermSize=512M (非堆内存最大值)
-XX:ReservedCodeCacheSize=64m (eclipse缓存)
相关推荐
vue常见面试题.zip vue常见面试题.zipvue常见面试题.zip vue常见面试题.zipvue常见面试题.zip vue常见面试题.zipvue常见面试题.zip vue常见面试题.zipvue常见面试题.zip vue常见面试题.zipvue常见面试题.zip vue常见...
Java常见面试题 Java是最流行的编程语言之一,掌握Java的基础知识是非常重要的。在这里,我们总结了Java常见的面试题,涵盖了Java的基础部分,包括基本语法、类相关的语法、内部类的语法、继承相关的语法、异常的...
java常见面试题汇总 java常见面试题汇总 java常见面试题汇总 java常见面试题汇总 java常见面试题汇总 java常见面试题汇总 java常见面试题汇总 java常见面试题汇总 java常见面试题汇总 java常见面试题汇总 java常见...
mysql常见面试题汇总,mysql常见面试题汇总 mysql常见面试题汇总,mysql常见面试题汇总 mysql常见面试题汇总,mysql常见面试题汇总 mysql常见面试题汇总,mysql常见面试题汇总 mysql常见面试题汇总,mysql常见面试题...
2022年最新Docker 常见面试题汇总 适用人群:即将要面试docker容器管理岗位的小伙伴,也适用于后期打算往docker容器化方向发展的小伙伴 内容概要:面试题较新,帮你轻松应对各大厂面试哦!
单片机常见面试题 本文总结了单片机常见面试题,涵盖了单片机系统的主要组成模块、数据流流向和控制流流向、单片机应用系统的设计原则、8051单片机的应用、中断的概念和过程、PC Chipset、Cache组成部分、同步异步...
Vue常见面试题及网友回答,收集来自阿里云社区,包括v-model, key, methods,错误处理,参数传递,父子组件,定时器,vue声明周期等问题
软件测试面试题软件测试常见面试题分享软件测试常见面试题分享软件测试常见面试题分享软件测试常见面试题分享软件测试常见面试题分享软件测试常见面试题分享软件测试常见面试题分享软件测试常见面试题分享软件测试...
以下是一些基于“java常见面试题合集”的相关知识点: 1. **基础语法**: - 类与对象:理解类的定义、对象的创建与访问权限。 - 继承与多态:掌握单一继承和接口的多实现,以及方法的重写和重载。 - 封装与抽象...
以下是一些关于Oracle常见面试题的知识点,这些知识点对于理解Oracle数据库的核心概念、功能和最佳实践至关重要。 1. **Oracle数据库版本与组件**:了解Oracle的不同版本(如Standard Edition、Enterprise Edition...
100道最新Java面试题,常见面试题及答案汇总
“常见面试题”是指在保研面试过程中可能会遇到的问题,通常包括但不限于基础理论知识、项目经验、编程能力、问题解决能力和研究潜力等方面。例如,面试官可能会询问考生对计算机网络协议的理解,数据结构的设计与...
这份2019版的大数据常见面试题集涵盖了Java在大数据环境中的关键知识点,旨在帮助求职者准备相关的面试。以下是一些可能的面试问题及其详细解答: 1. **Java内存模型与垃圾回收** - Java内存分为堆内存和栈内存。...
《C/C++程序设计员应聘常见面试试题深入剖析》 面试是检验程序员技能的重要环节,尤其是在C/C++领域,面试官常常通过一系列精心设计的问题来评估候选人的技术水平和解决问题的能力。本文将对一些常见的C/C++面试题...
云原生训练营 _ Kubernetes 常见面试题汇总.pdf
零碎时间利用小程序查看常见面试题,夯实Java基础。 一款面试刷题的 Spring Cloud 开源系统。零碎时间利用小程序查看常见面试题,夯实Java基础。 一款面试刷题的 Spring Cloud 开源系统。零碎时间利用小程序查看常见...