JUC相关八股文自述

1.什么是CAS
答:CAS就是compare and swap,比较并替换,是乐观锁的一种实现方式,是一种轻量级锁。
2.CAS怎么实现线程安全的?
答:首先这是一个原子操作,线程在读取数据时不加锁,在准备写回数据时,先判断与原值是否相等,如相等则修改写回,若不想等则继续进行读取流程,就是自旋。
3.CAS有什么问题?
答:若是结果一直在变,那么CAS就会一直自旋,这存在CPU开销的问题,且无法防止ABA问题,且只能保证操作单个共享变量是原子操作。JUC中的AtomicInteger的自增函数incrementAndGet()就是依赖CAS。
4.如何防止ABA问题
答:加版本号,被修改一次就+1。
5.聊一下悲观锁
答:在任何时候都会加锁,sync以及lock就是悲观锁的实现。
6.sync的实现
答:静态同步方法和同步代码块锁住的是class对象,而同步方法锁住的是对象。当sync应用在方法时,在字节码中是通过ACC_SYNCHRONIZED标志的,其他线程检测该方法这个标志位是否被设置,有就代表别的线程拥有了它,你就别碰。应用在同步代码块上时,是通过monitorenter和monitorexit指令,两个分别位于代码块的头和尾,线程试图获取锁其实就是试图获取对象头中的monitor对象,如果锁计数器为0,那么就可以执行mointorenter操作,对计数器+1,执行完毕后执行monitorexit操作,对计数器-1
7.sync锁升级过程
答:jdk1.6的时候,对sync进行了优化,引入了意向锁,轻量级锁,重量级锁。最开始是无锁状态,当一个线程要获取锁的时候就会升级为意向锁,他只是会比较一下线程的ThreadID,当发现出现不同即线程竞争的时候会升级为轻量级锁,轻量级锁是采用CAS操作,当自旋一定次数之后还没swap成功,则会升级为重量级锁,这个升级过程是不可逆的。
8.何为重量级锁
答:当某个线程没有获取重量级锁时,会被阻塞,当可以可获取锁时会被叫醒,阻塞与叫醒是需要内核态才能完成的,因此重量锁十分耗时的原因时存在内核与用户态之间的转换。
9.lock的实现
答:ReentrantLock是基于AQS+CAS实现的,AQS即队列同步器,AQS里面维护着一个volatile修饰的state,还有有一个线程同步队列,当某个线程想要争夺锁的时候就需要进入同步队列等待,当某个线程拥有锁之后,state会+1,此时线程队列里的其他线程就无法获取锁了
10.sync与lock的
答:首先sync与lock都是可重入锁,就是自己可以再次获取自己内部的锁,获取之后,锁计数器+1,释放-1,直到计数器为0,才算做完全释放,sync是一个关键字,而lock则是一个接口,sync是自动释放锁,而lock是手动释放锁,且lock可以实现中断,不会一直等待,sync是非公平锁,而lock默认是非公平,但是也可以改为公平
11.volatile 关键字
答:volatile 关键字被用来保证java主存与线程内存的变量实时同步,换句话来说就是保证线程间变量的可见性,当一个volatile 修饰的变量被修改后,他会立刻更新到主存,并将其他线程读取该变量时直接从主存读。其次volatile 关键字是无法保证原子性操作的,可以用i++来验证。然后volatile 可以防止指令的重排,就是volatile 前面的指令一定会在volatile 前面执行,volatile 后面的指令,一定会在volatile 后面执行。
12.HashMap底层
答:HashMap在jdk1.7之前是数组+链表,jdk1.7之后则变为数组+链表/红黑
13.HashMap扩容机制
答:当HashMap的键值对数量超过阈值的时候,就会进行扩容,扩容后数组长度以及阈值变为原来的两倍,阈值的初始值为数组长度*负载因子。负载因子默认值为0.75,负载因子越大每条链可容纳的键值对越多。初始容量为16,当链表长度大于8且数组长度大于64,就会进行树化,当树的节点小于6,则会进行链化
14.创建线程的方法
答:写一个自定义Thread继承Thread,重写run,直接实现一个Runable,重写run。实现一个Callable,重写call方法,可以用futuretask来接收返回值。(Futuretask是继承于Runable的),submit用于有返回值的提交任务,execute用于无返回值的提交,其实submit内部也是用的execute,但是先将传入进来的runnable转为一个futuretask然后在执行execute
15.如何停止一个线程
答:一个线程运行完是会自动结束的,若是循环则外面调用Thread.interrupt,线程循环内部实时判断当前线程中断标志位Thread.currentThread().isInterrupted()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值