Ran丶 level
获赞
67
粉丝
13
关注
3
看过 TA
290
四川长江职业学院
2026
golang
IP属地:重庆
暂未填写个人简介
私信
关注
问题:1、LinkedList和ArrayList存储了一定数据,循环了上亿次,谁执行的速度快,为什么2、如果两种数据类型存储了1到100的数据,每次遍历到50个数字之后就将之前遍历的拼接最后面,谁快,为什么(好像是,具体问的什么有点遗忘了)3、创建一块新的内存一定比指针重新指向慢吗,为什么4、synchronized和reentrantlock区别5、synchronized原理,它是如何锁住临界资源的6、reentrantlock原理,阻塞队列是如何锁住线程的7、线程池参数,作用8、核心线程数5个,阻塞队列长度7,最大线程数10,20个任务,一个任务执行1分钟。是否会触发拒绝策略?会执行多久?9、如果我想在一分钟完成所用任务,该如何设计线程池10、mysql事务的四大特性11、事物的隔离性是如何实现的12、MVCC13、如果在读已提交的事物隔离级别下,是否会用到MVCC,为什么14、mysql中有一个表有(A,B,C,D)字段,select A,B from 表 where C=? and D=?,如何让这段SQL执行速度达到最快?15、如果是查C,D。查询条件是A,B呢,索引该如何设计。如果不知道这四个字段查询的数据和查询的条件该如何设计16、redis的过期删除策略17、定期删除时,redis是如何扫描内存的18、利用hash表存储数据,既想通过key查询value,又想获取最大值或者最小值或者中间某个年龄(场景是key:name,vlue:年龄),使它的存储有顺序,该如何设计19、优先级队列的数据结构,优先级队列一定是通过数组实现的吗20、讲一讲git的命令21、一个分支上面提交了1,2,3,如何得到1,3而跳过222、避免重复下单的几种解决方案23、如果用户没有一个唯一标识或者说用户不需要登陆就能下单,该如何避免重复下单24、前端一次性传入很大的excel该如何处理25、在大文件进入到内存之前如何避免一次性传入过大的文件26、算法:对称二叉树(大概是这些,有些可能忘了)
茅不易:首先在来接syn锁之前,需要了解我们java中对象头的结构,对象头中包含objectheader,class work以及我们的markword,markword主要从初hashcode 分代年龄等信息,首先对于原始的syn锁,我们也叫他重量级锁,在对对象加锁的过程中,会调用native方法跟操作系统申请一个监视器对象,然后将二者关联起来,在关联的过程中,会讲对象头中的markword交给monitor管理,然后markword存储对应monitor的地址,方便我们后续加锁的时候寻址,syn锁是基于monitor实现的,他里面包含owner来存储thread对象,为null则表示当前没有线程获取锁,不为null则表示已经有人获取锁了,会进入到entryset中排队等待,当然如果获取锁的线程由于一些i蛀牙UN没有准备好,进入wait,会释放锁然后进入到waitset中等待,当其他持有锁的线程进行notify后会将waitset中线程放入到entryset中等待,这个set是无序集合,所以不确定哪个线程被调度后持所锁,所以syn是非公平锁,由于加锁每次都需要跟操作系统申请monitor,这个操作sh比较重的,所以jvm底层做了很多优化,比如:重量级锁的自旋,没获取到锁在重试几次,减少线程从运行变更为阻塞状态的上下文切换,还有就是轻量级锁,使用场景是不存咋锁竞争的情况,他会在当前thread staack中创建一个lock record记录,然后将lock record 和 对象头中的markword进行 cas交换,如果当前线程发生了锁重入,发现markword里面存的lockrecrd是当前线程会将所重入的lock 记录 方null,用来记录所重入的次数,释放锁则移除一个lock rerecord,后续如果发生锁竞争,还是会走cas操作尝试交换信息,结果发现已经被交换完了,说明发生了锁竞争就会走锁锁膨胀逻辑,变成重量级锁,然后本身持有轻量级锁的线程会走重量级锁的释放锁的流程.......当然如果不存在锁竞争的情况下,频繁发生自旋,每次都要cas操作,效率也比较低,底层做了优化,干脆直接把线程id刻到markword里面,这也就是偏向锁.......
0 点赞 评论 收藏
分享
关注他的用户也关注了:
牛客网
牛客企业服务