interview记录
面试中可能遇到的
qq_41911762
为每行代码增添注释
展开
-
JDK6 synchronize锁的优化
自适应自旋锁在共享数据持有时间较短的时候,切换线程开销不值得,通过循环等待锁释放,不让出CPU资源。锁的自旋次数不固定,由前一次在同一个锁上的自旋时间及锁的持有者状态,也就是成功率来确定自旋次数,达到自旋次数还未获取锁就进入阻塞。适应自旋锁会根据自旋获取锁的成功率来调整自旋次数,如果获取锁成功率高会调高自旋次数,否则反之。锁消除JIT编译时,对运行上下文扫描,去除不可能存在竞争的锁...原创 2020-03-09 15:10:30 · 263 阅读 · 0 评论 -
synchronize的几种用法
1.作用在普通方法上在这种情况下是对象锁,下面可以看到同一时刻只有一个线程能进入demo对象的increase()方法。要进入synchronized修饰的普通方法,就要获取当前对象(demo)的锁。这种方式仅适用于单例模式。Demo类:package sychronize_usage;public class Demo { volatile int count...原创 2019-10-29 18:19:03 · 2102 阅读 · 0 评论 -
java中如何中断线程
如何中断线程1、另外线程调用此线程对象的interrupt()方法,通知线程应该中断了。(1)果线程处于阻塞状态(sleep、wait、join),那么线程将立即退出被阻塞状态,并抛出一个InterruptedException异常。(2)处于正常活动状态,那么会将该线程的中断标记设置为true。被设置中断标志的线程将继续正常运行,不受影响。2、需要被调用的线程配合响应中断,正常运...原创 2020-03-08 11:16:22 · 169 阅读 · 0 评论 -
关于Thread.yield()
关于Thread.yield()1. 提示线程调度器表示当前线程可以让出 CPU, 但是调度器可能选择忽略。2. yield 不会改变当前同步锁的状态。原创 2020-03-08 10:25:40 · 217 阅读 · 0 评论 -
Thread的start()和run()方法区别
Thread的run和start的区别1.startstart()方法会调用原生JVM_StartThread方法,去创建一个子线程(thread-entity)并通过ThreadRun方法去调用run方法。2.run()方法只是Thread的一个普通的方法调用。...原创 2020-03-07 10:18:40 · 117 阅读 · 0 评论 -
对象的finalize()方法作用是什么
Object的finalize()方法的作用是什么?答:finalize()的作用是为对象创造最后一次逃脱死亡的机会。当垃圾回收器宣告一个对象死亡时,至少要经过两次的标记过程,如果对象在进行可达性分析后,发现对象该没有和GC Roots相连接的引用链,就会被第一次标记,并且判断是否执行finalize()方法,如果对象覆盖finalize()方法且未被引用过,这个对象就会被放置在F-Queue...原创 2020-03-06 00:25:35 · 2550 阅读 · 0 评论 -
java中的强引用、软引用、弱引用、虚引用
强引用普通的new一个对象比如,Object obj = new Object(),obj就是强引用,一个对象只要被强引用指向,那么这个对象就不会被回收。软引用软引用相对强引用要弱化一些,当对象有弱引用而无强引用关联时,当内存空间足够的时候,垃圾回收器不会回收它。适合用在缓存的应用场景中,如果内存充足,则可以缓存业务数据,如果内存不够则可以将其指向的对象回收。弱引用在垃圾回收时...原创 2020-03-06 01:29:31 · 186 阅读 · 0 评论 -
线程间通信之生产者消费者模型(notify()、notifyAll()的区别、多个生产者消费者比较分析)
锁池(entrySet): 假设线程A已经拥有对象锁,线程B、C想要获取锁就会被阻塞(blocked),进入一个地方去等待锁的等待,这个地方就是该对象的锁池;等待池(waitSet): 假设线程A调用某个对象的wait方法,线程A就会释放该对象锁,同时线程A进入该对象的等待池中,状态为waiting,进入等待池中的线程不会去竞争该对象的锁。另外线程调用对象notify(...原创 2019-11-03 18:00:49 · 287 阅读 · 1 评论 -
单例模式与线程安全(懒汉式、double check、volatile)
1.饿汉式单例饿汉式单例:在类加载的时候,就已经初始化,无论之后用没用到。这样写法简单,线程安全,但是占内存。值得注意的是构造方法必须私有。package Singleton;public class HungerSingleton { private static HungerSingleton singleton=new HungerSingleton(); p...原创 2019-10-29 20:30:00 · 466 阅读 · 1 评论 -
ReentrantLock公平锁与非公平锁的区别
1、在公平实现中,sync为FairSync,其lock()方法与NonfairSync相比,少了抢占的步骤:NonfairSync中的lock():final void lock() { if (compareAndSetState(0, 1))//抢占 setExclusiveOwnerThread(Thread.currentT...原创 2019-10-31 17:17:43 · 212 阅读 · 0 评论 -
ReentrantLock之非公平锁的实现
Lock接口、ReentrantLock、Sync、FairSync、NonFairSync、AbstractQueuedSynchronizer(AQS)的关系:ReentrantLock实现了Lock接口;Sync是ReentrantLock中的一个内部抽象类、继承了AQS;FairSync和NonfairSync都是ReentrantLock中的内部类,都继承了Sync,并且实现了S...原创 2019-10-31 10:57:52 · 418 阅读 · 0 评论 -
用ReentrantLock、Condition实现三个线程的for循环交替打印
好记性不如烂笔头,在此记下Reentrant与Condition配合使用的一般方法。有三个线程tA、tB、tC,当i为1时线程tA打印,当i为2时线程B打印,当i为3时线程C打印,并且这三个线程遵循tA唤醒tB,tB唤醒tC,tC唤醒tA的规则。package reentrantLockUsage;import java.util.concurrent.locks.Condition...原创 2019-10-30 17:45:04 · 1328 阅读 · 0 评论 -
JVM运行时数据区
JVM运行时数据区和虚拟机内存模型运行时数据区:程序计数器,java虚拟机栈,本地方法栈,java堆,方法区。其中红色为线程隔离的数据区,蓝色为线程共享的数据区。方法区还包括:运行时常量池。虚拟机内存模型:程序计数器,java虚拟机栈,本地方法栈,java堆,方法区,运行时常量池,直接内存。直接内存不属于运行时数据区。程序计数器内存空间小,字节码解释器工作时通过改变这...原创 2019-12-09 23:25:08 · 168 阅读 · 2 评论 -
JDBC为什么破坏双亲委派模型
详细见原文https://www.cnblogs.com/yueshutong/p/11430885.html讲得非常详细,找了很多文章,就这篇讲的非常清楚,所以总结一下简单来说DriverManager位于 $JAVA_HOME中jre/lib/rt.jar 包,由BootStrap类加载器加载,而其Driver接口的实现类是位于服务商提供的 Jar 包,根据类加载机制,当被装载的...转载 2019-12-10 01:42:02 · 771 阅读 · 1 评论 -
类加载过程及forName()和loadClass()的区别
类加载过程:1.加载:通过ClassLoader加载class文件字节码,生成Class对象。2.链接:校验:检查加载的class的正确性和安全性。 准备:为类变量分配存储空间并设置类变量初始值。 解析:jvm将常量池内的符号引用转换为直接引用。3.初始化:执行类变量赋值和静态代码块。区别:loadClass只执行到“...原创 2020-03-04 10:30:41 · 156 阅读 · 0 评论 -
forName已经完成初始化,那么为什么还要用loadClass呢?
有些情况是只需要知道这个类的存在而不需要初始化的情况使用Classloder.loaderClass,如springIOC懒加载,而有些时候又必须执行初始化就选择Class.forName,比如JDBC注册驱动。Driver在static块中会注册自己到java.sql.DriverManager。而static块就是在Class的初始化中被执行。package com.mysql.cj...原创 2020-03-04 10:59:11 · 223 阅读 · 0 评论 -
java垃圾回收算法
垃圾标记算法要回收垃圾,则要知道哪些是垃圾引用计数算法(判断对象的引用数量,每个对象实例都有一个引用计数器,被引用+1、完成引用-1) 优点:执行效率高,程序执行受影响较小 缺点:无法检测出循环引用的情况,导致内存泄漏可达性分析算法(判断对象的引用链是否可达来决定对象是否可以被回收) 可以作为g...原创 2020-03-05 10:40:12 · 151 阅读 · 0 评论 -
java常见垃圾收集器
一、垃圾回收相关理论Stop-The-Word(STW):JVM要执行GC而停止应用程序的运行,STW会在任何一种GC算法中发生,除了GC线程之外所有线程都处于等待状态,多数GC优化通过减少STW的时间来提升系统吞吐量。Safepoint(安全点):分析对象引用关系的时候,所有线程在这个点被冻结,不可以出现对象引用关系还在变化的情况,分析结果要在某个节点有确定性,该节点叫做安全点。产生安全...原创 2020-03-05 19:46:04 · 151 阅读 · 0 评论