写点什么

本科毕业斩获字节 offer 的我做了什么准备?大厂面试经验试题分享 (1)

用户头像
极客good
关注
发布于: 刚刚

当使用 ThreadLocal 维护变量时,ThreadLocal 为每个使用该变量的线程提供独立的变量副本,每个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本,是线程隔离的。线程隔离的秘密在于 ThreadLocalMap 类(ThreadLocal 的静态内部类)


线程局部变量是局限于线程内部的变量,属于线程自身所有,不在多个线程间共享。Java 提供 ThreadLocal 类来支持线程局部变量,是一种实现线程安全的方式。但是在管理环境下(如 web 服务器)使用线程局部变量的时候要特别小心,在这种情况下,工作线程的生命周期比任何应用变量的生命周期都要长。任何线程局部变量一旦在工作完成后没有释放,Java 应用就存在内存泄露的风险。


ThreadLocal 的方法:void set(T value)、T get()以及 T initialValue()。


ThreadLocal 是如何为每个线程创建变量的副本的:


首先,在每个线程 Thread 内部有一个 ThreadLocal.ThreadLocalMap 类型的成员变量 threadLocals,这个 threadLocals 就是用来存储实际的变量副本的,键值为当前 ThreadLocal 变量,value 为变量副本(即 T 类型的变量)。初始时,在 Thread 里面,threadLocals 为空,当通过 ThreadLocal 变量调用 get()方法或者 set()方法,就会对 Thread 类中的 threadLocals 进行初始化,并且以当前 ThreadLocal 变量为键值,以 ThreadLocal 要保存的副本变量为 value,存到 threadLocals。然后在当前线程里面,如果要使用副本变量,就可以通过 get 方法在 threadLocals 里面查找。


总结:


a、实际的通过 ThreadLocal 创建的副本是存储在每个线程自


【一线大厂Java面试题解析+核心总结学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


己的 threadLocals 中的


b、为何 threadLocals 的类型 ThreadLocalMap 的键值为 ThreadLocal 对象,因为每个线程中可有多个 threadLocal 变量,就像上面代码中的 longLocal 和 stringLocal;


c、在进行 get 之前,必须先 set,否则会报空指针异常;如果想在 get 之前不需要调用 set 就能正常访问的话,必须重写 initialValue()方法


12)用 wait-notify 写一段代码来解决生产者-消费者问题?


请参考答案中的示例代码。只要记住在同步块中调用 wait() 和 notify()方法,如果阻塞,通过循环来测试等待条件。


13) 用 Java 写一个线程安全的单例模式(Singleton)?


请参考答案中的示例代码,这里面一步一步教你创建一个线程安全的 Java 单例类。当我们说线程安全时,意思是即使初始化是在多线程环境中,仍然能保证单个实例。Java 中,使用枚举作为单例类是最简单的方式来创建线程安全单例模式的方式。


14)Java 中 sleep 方法和 wait 方法的区别?


虽然两者都是用来暂停当前运行的线程,但是 sleep() 实际上只是短暂停顿,因为它不会释放锁,而 wait() 意味着条件等待,这就是为什么该方法要释放锁,因为只有这样,其他等待的线程才能在满足条件时获取到该锁。


15)什么是不可变对象(immutable object)?Java 中怎么创建一个不可变对象?


不可变对象指对象一旦被创建,状态就不能再改变。任何修改都会创建一个新的对象,如 String、Integer 及其它包装类。详情参见答案,一步一步指导你在 Java 中创建一个不可变的类。


16)我们能创建一个包含可变对象的不可变对象吗?


是的,我们是可以创建一个包含可变对象的不可变对象的,你只需要谨慎一点,不要共享可变对象的引用就可以了,如果需要变化时,就返回原对象的一个拷贝。最常见的例子就是对象中包含一个日期对象的引用。


数据类型和 Java 基础面试问题


17)Java 中应该使用什么数据类型来代表价格?


如果不是特别关心内存和性能的话,使用 BigDecimal,否则使用预定义精度的 double 类型。


18)怎么将 byte 转换为 String?


可以使用 String 接收 byte[] 参数的构造器来进行转换,需要注意的点是要使用的正确的编码,否则会使用平台默认编码,这个编码可能跟原来的编码相同,也可能不同。


19)Java 中怎样将 bytes 转换为 long 类型?


String 接收 bytes 的构造器转成 String,再 Long.parseLong


20)我们能将 int 强制转换为 byte 类型的变量吗?如果该值大于 byte 类型的范围,将会出现什么现象?


是的,我们可以做强制转换,但是 Java 中 int 是 32 位的,而 byte 是 8 位的,所以,如果强制转化是,int 类型的高 24 位将会被丢弃,byte 类型的范围是从 -128 到 127。


21)存在两个类,B 继承 A,C 继承 B,我们能将 B 转换为 C 么?如 C = (C) B;


可以,向下转型。但是不建议使用,容易出现类型转型异常.


22)哪个类包含 clone 方法?是 Cloneable 还是 Object?


java.lang.Cloneable 是一个标示性接口,不包含任何方法,clone 方法在 object 类中定义。并且需要知道 clone() 方法是一个本地方法,这意味着它是由 c 或 c++ 或 其他本地语言实现的。


23)Java 中 ++ 操作符是线程安全的吗?


不是线程安全的操作。它涉及到多个指令,如读取变量值,增加,然后存储回内存,这个过程可能会出现多个线程交差。


24)a = a + b 与 a += b 的区别


+= 隐式的将加操作的结果类型强制转换为持有结果的类型。如果两这个整型相加,如 byte、short 或者 int,首先会将它们提升到 int 类型,然后在执行加法操作。


byte a = 127; byte b = 127; b = a + b; // error : cannot convert from int to byte b += a; // ok


(因为 a+b 操作会将 a、b 提升为 int 类型,所以将 int 类型赋值给 byte 就会编译出错)


25)我能在不进行强制转换的情况下将一个 double 值赋值给 long 类型的变量吗


不行,你不能在没有强制类型转换的前提下将一个 double 值赋值给 long 类型的变量,因为 double 类型的范围比 long 类型更广,所以必须要进行强制转换。


26)3*0.1 == 0.3 将会返回什么?true 还是 false?


false,因为有些浮点数不能完全精确的表示出来。


27)int 和 Integer 哪个会占用更多的内存?


Integer 对象会占用更多的内存。Integer 是一个对象,需要存储对象的元数据。但是 int 是一个原始类型的数据,所以占用的空间更少。


28)为什么 Java 中的 String 是不可变的(Immutable)


Java 中的 String 不可变是因为 Java 的设计者认为字符串使用非常频繁,将字符串设置为不可变可以允许多个客户端之间共享相同的字符串。更详细的内容参见答案。


29)我们能在 Switch 中使用 String 吗?


从 Java 7 开始,我们可以在 switch case 中使用字符串,但这仅仅是一个语法糖。内部实现在 switch 中使用字符串的 hash code。


30)Java 中的构造器链是什么?


当你从一个构造器中调用另一个构造器,就是 Java 中的构造器链。这种情况只在重载了类的构造器的时候才会出现。


JVM 底层 与 GC(Garbage Collection) 的面试问题


31)64 位 JVM 中,int 的长度是多数?


32)Serial 与 Parallel GC 之间的不同之处?


33)32 位和 64 位的 JVM,int 类型变量的长度是多数?


34)Java 中 WeakReference 与 SoftReference 的区别?


35)WeakHashMap 是怎么工作的?


36)JVM 选项 -XX:+UseCompressedOops 有什么作用?为什么要使用?


37)怎样通过 Java 程序来判断 JVM 是 32 位 还是 64 位?


38)32 位 JVM 和 64 位 JVM 的最大堆内存分别是多数?


39)JRE、JDK、JVM 及 JIT 之间有什么不同?


3 年工作经验的 Java 面试题


40)解释 Java 堆空间及 GC?


JVM 底层面试题及答案


41)你能保证 GC 执行吗?


42)怎么获取 Java 程序使用的内存?堆使用的百分比?


43)Java 中堆和栈有什么区别?


Java 基本概念面试题


44)“a==b”和”a.equals(b)”有什么区别?


45)a.hashCode() 有什么用?与 a.equals(b) 有什么关系?


46)final、finalize 和 finally 的不同之处?


47)Java 中的编译期常量是什么?使用它什么风险?


再给大家截图看一下文档里的内容吧:


Java 多线程


=======



JVM


===



Redis


=====



用户头像

极客good

关注

还未添加个人签名 2021.03.18 加入

还未添加个人简介

评论

发布
暂无评论
本科毕业斩获字节offer的我做了什么准备?大厂面试经验试题分享(1)