如果你是一个 Java 面试官,你会问哪些问题?

Java基础


说说进程和线程的区别?
进程是程序的一-次执行,是系统进行资源分配和调度的独立单位,他的作用是是程序能够并发执行
提高资源利用率和吞吐率。
由于进程是资源分配和调度的基本单位,因为进程的创建、销毁、切换产生大量的时间和空间的开
销,进程的数量不能太多,而线程是比进程更小的能独立运行的基本单位,他是进程的一个实体,
可以减少程序并发执行时的时间和空间开销,使得操作系统具有更好的并发性。
线程基本不拥有系统资源,只有一些运行时必不可少的资源 ,比如程序计数器、寄存器和栈,进程
则占有堆、栈。


知道synchronized原理吗?
synchronized是java提供的原子性内置锁,这种内置的并且使用者看不到的锁也被称为监视器锁
使用synchronized之后,会在编译之后在同步的代码块前后加上monitorenter和monitorexit字节
码指令,他依赖操作系统底层互斥锁实现。他的作用主要就是实现原子性操作和解决共享变量的内
存可见性问题。
执行monitorenter指令时会尝试获取对象锁,如果对象没有被锁定或者已经获得了锁,锁的计数器
+1。此时其他竞争锁的线程则会进入等待队列中。
执行monitorexit指令时则会把计数器-1 ,当计数器值为0时,则锁释放,处于等待队列中的线程再
继续竞争锁。
synchronized是排它锁,当-个线程获得锁之后,其他线程必须等待该线程释放锁后才 能获得锁
而且由于Java中的线程和操作系统原生线程是一-对应的 ,线程被阻塞或者唤醒时时会从用户态切
换到内核态,这种转换非常消耗性能。
从内存语义来说,加锁的过程会清除工作内存中的共享变量,再从主内存读取,而释放锁的过程则
是将工作内存中的共享变量写回主内存。


实际上大部分时候我认为说到monitorenter就行了,但是为了更清楚的描述,还是再具体一点。


如果再深入到源码来说, synchronized实际上有两个队列waitSet和entryList。


1.当多个线程进入同步代码块时,首先进入entryList
2.有一个线程获取到monitor锁后,就赋值给当前线程,并且计数器+1
3.如果线程调用wait方法,将释放锁,当前线程置为null ,计数器-1 ,同时进入waitSet等待被唤
醒,调用notify或者notifyAll之后又会进入entryList竞争锁
4.如果线程执行完毕,同样释放锁,计数器-1,当前线程 置为null
 

那锁的优化机制了解吗?


从JDK1.6版本之后, synchronized本身也在不断优化锁的机制,有些情况下他并不会是一个很重量
级的锁了。优化机制包括自适应锁、自旋锁、 锁消除、锁粗化、轻量级锁和偏向锁。
锁的状态从低到高依次为无锁- >偏向锁- >轻量级锁->量级锁,升级的过程就是从低到高,降级在
-定条件也是有可能发生的。


自旋锁:由于大部分时候,锁被占用的时间很短,共享变量的锁定时间也很短,所有没有必要挂起
线程,用户态9和内核态的来回上下文切换严重影响性能。自旋的概念就是让线程执行一个忙循
环,可以理解为就是啥也不干,防止从用户态转入内核态,自旋锁可以通过设置XX:+ UseSpining
来开启,自旋的默认次数是10次,可以使用-XX:PreBlockSpin设置。


自适应锁:自适应锁就是自适应的自旋锁,自旋的时间不是固定时间,而是由前一次在同-一个锁上
的自旋时间和锁的持有者状态来决定。
锁消除:锁消除指的是JVM检测到-些同步的代码块,完全不存在数据竞争的场景,也就是不需要
加锁,就会进行锁消除。


锁粗化:锁粗化指的是有很多操作都是对同一个对象进行加锁,就会把锁的同步范围扩展到整个操
作序列之外。
偏向锁:当线程访问同步块获取锁时,会在对象头和栈帧中的锁记录里存储偏向锁的线程ID ,之后
这个线程再次进入同步块时都不需要CAS来加锁和解锁了,偏向锁会永远偏向第一个获得锁的线
程,如果后续没有其他线程获得过这个锁,持有锁的线程就永远不需要进行同步,反之, 当有其他,
线程竞争偏向锁时, 持有偏向锁的线程就会释放偏向锁。可以用过设置X:+UseBiasedLocking开
启偏向锁。
轻量级锁: JVM的对象的对象头中包含有一些锁的标志位 ,代码进入同步块的时候, JVM将会使用
CAS方式来尝试获取锁,如果更新成功则会把对象头中的状态位标记为轻量级锁,如果更新失败,
当前线程就尝试自旋来获得锁。


整个锁升级的过程非常复杂,我尽力去除一些无用的环节 ,简单来描述整个升级的机制。
简单点说,偏向锁就是通过对象头的偏向线程ID来对比,甚至都不需要CAS了, 而轻量级锁主要就
是通过CAS修改对象头锁记录和自旋来实现,重量级锁则是除了拥有锁的线程其他全部阻塞。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

倾听铃的声

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值