更新时间:2020-04-24 13:57:59 来源:极悦 浏览2208次
ThreadLocal(线程变量副本)
Synchronized实现内存共享,ThreadLocal为每个线程维护一个本地变量。
采用空间换时间,它用于线程间的数据隔离,为每一个使用该变量的线程提供一个副本,每个线程都可以独立地改变自己的副本,而不会和其他线程的副本冲突。
ThreadLocal类中维护一个Map,用于存储每一个线程的变量副本,Map中元素的键为线程对象,而值为对应线程的变量副本。
ThreadLocal在Spring中发挥着巨大的作用,在管理Request作用域中的Bean、事务管理、任务调度、AOP等模块都出现了它的身影。
Spring中绝大部分Bean都可以声明成Singleton作用域,采用ThreadLocal进行封装,因此有状态的Bean就能够以singleton的方式在多线程中正常工作了。
“你能不能谈谈,javaGC是在什么时候,对什么东西,做了什么事情?”
在什么时候:
1、新生代有一个Eden区和两个survivor区,首先将对象放入Eden区,如果空间不足就向其中的一个survivor区上放,如果仍然放不下就会引发一次发生在新生代的minorGC,将存活的对象放入另一个survivor区中,然后清空Eden和之前的那个survivor区的内存。在某次GC过程中,如果发现仍然又放不下的对象,就将这些对象放入老年代内存里去。
2、大对象以及长期存活的对象直接进入老年区。
3、当每次执行minorGC的时候应该对要晋升到老年代的对象进行分析,如果这些马上要到老年区的老年对象的大小超过了老年区的剩余大小,那么执行一次FullGC以尽可能地获得老年区的空间。
对什么东西:
从GCRoots搜索不到,而且经过一次标记清理之后仍没有复活的对象。
做什么:
新生代:复制清理;老年代:标记-清除和标记-压缩算法;永久代:存放Java中的类和加载类的类加载器本身。
GCRoots都有哪些:1.虚拟机栈中的引用的对象2.方法区中静态属性引用的对象,常量引用的对象3.本地方法栈中JNI(即一般说的Native方法)引用的对象。
Synchronized与Loc
Synchronized与Lock都是可重入锁,同一个线程再次进入同步代码的时候。可以使用自己已经获取到的锁。
Synchronized是悲观锁机制,独占锁。而Locks.ReentrantLock是,每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。
ReentrantLock适用场景
1、某个线程在等待一个锁的控制权的这段时间需要中断;
2、需要分开处理一些wait-notify,ReentrantLock里面的Condition应用,能够控制notify哪个线程,锁可以绑定多个条件;
3、具有公平锁功能,每个到来的线程都将排队等候。
StringBuffer是线程安全的,每次操作字符串,String会生成一个新的对象,而StringBuffer不会;StringBuilder是非线程安全的。
fail-fast是什么?
fail-fast:机制是java集合(Collection)中的一种错误机制。当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件。
例如:当某一个线程A通过iterator去遍历某集合的过程中,若该集合的内容被其他线程所改变了;那么线程A访问集合时,就会抛出ConcurrentModificationException异常,产生fail-fast事件。
happens-before
happens-before:如果两个操作之间具有happens-before关系,那么前一个操作的结果就会对后面一个操作可见。
1、程顺序规则:一个线程中的每个操作,happens-before于该线程中的任意后续操作。
2、监视器锁规则:对一个监视器锁的解锁,happens-before于随后对这个监视器锁的加锁。
3、volatile变量规则:对一个volatile域的写,happens-before于任意后续对这个volatile域的读。
4、传递性:如果Ahappens-beforeB,且Bhappens-beforeC,那么Ahappens-beforeC。
5、线程启动规则:Thread对象的start()方法happens-before于此线程的每一个动作。
Volatile和Synchronized的不同点
Volatile和Synchronized四个不同点:
1、粒度不同,前者针对变量,后者锁对象和类;
2、syn阻塞,volatile线程不阻塞;
3、syn保证三大特性,volatile不保证原子性;
4、syn编译器优化,volatile不优化volatile具备两种特性:
保证此变量对所有线程的可见性,指一条线程修改了这个变量的值,新值对于其他线程来说是可见的,但并不是多线程安全的;
禁止指令重排序优化。
以上就是极悦java培训机构的小编针对“深圳java常见面试题,程序员面试收藏”的内容进行的回答,希望对大家有所帮助,如有疑问,请在线咨询,有专业老师随时为你服务。
0基础 0学费 15天面授
Java就业班有基础 直达就业
业余时间 高薪转行
Java在职加薪班工作1~3年,加薪神器
工作3~5年,晋升架构
提交申请后,顾问老师会电话与您沟通安排学习