java面试线程必备知识点,怼死面试官,从我做起

转载自 java面试线程必备知识点,怼死面试官,从我做起

|--多线程一定好么?

cpu密集不好 io密集好

|--如何减少上下文切换:

无锁并发(数据id根据Hash分段)、CAS、最少线程

|--java线程避免死锁:

避免一个线程同时有多个锁

避免一个锁占用多个资源

lock.tryLock代替内部锁

内存屏障:限制命令操作顺序,有LoadLoad、LoadStore、LoadStore、StroreStreo四种屏障

缓冲行:cpu缓存最小储存单位

写命中:缓存有,直接写入缓存

缓存一致性:主存改变,其他缓存改变(read、load、use绑定)

顺序一致性:单个线程内执行结果一定是不变的(但依然有指令重排,只是结果不受影响的重排)

|--八个CPU原子命令:

lock、unlock、read、load、use、assign、store、write

|--volatile做的事:

1.lock前缀指令使缓存行立即写入内存(assign、store、write绑定)

2.其他cpu缓存无效

3.加入内存屏障

使用前景:不依赖于上次数据

使用案例:i++:tmp = i;tmp=tmp+1;i = tmp;

64位机器跑32位jvm,long和double:2段分2次计算,不加volatile会导致结果前32位是一个线程结果,后32位一个线程结果

|--synchronized

对象加锁,Monitor对象,monitorenter和monitorexit命令实现

锁升级

|--ReentrantLock 可重入锁

通过CVS等实现,比synchronized效率略高,有公平锁非公平锁

锁可多次进入,并把拥有数++

lock(), 如果获取了锁立即返回,如果别的线程持有锁,当前线程则一直处于休眠状态,直到获取锁

tryLock(), 如果获取了锁立即返回true,如果别的线程正持有锁,立即返回false;

|--ReentrantReadWriteLock

read/write两把锁

写锁与ReetrantLock类似,只有写锁读锁都没被占用才获得锁

读锁拥有数是多个线程的,每个线程拥有数只能自己通过ThreadLocal记录

写锁结束降级读锁,避免可见性问题

|--Lock和synchronized区别

Lock是通过代码级实现,cvs

synchronized是通过jvm的monitor实现的

还多了 锁投票,定时锁等候和中断锁等候等特性

使用ReentrantLock,如果A不释放,可以使B在等待了足够长的时间以后,中断等待,而干别的事情

|--AQS(AbstractQueuedSynchronized)

有队列,有state、进入会先自旋再阻塞,默认非公平,队列唤醒了调用tryAcquire,不一定能获取锁

|--java对象头:

MarkWord 长度:32/64,存储hashCode或者锁信息

|--CAS unsafe.compareAndSwap(对象地址,原来值,要修改值)

unsafe是通过操作系统实现(CMPXCHG指令),如果失败返回false;

|--CAS使用:自旋锁、自适应自旋锁

|--锁的升级

偏向锁(markword指向所在线程,代价低,两个线程则停安全点撤销)->轻量级线程(markword置换到拥有者线程,线程对象互指。两个线程则b线程自旋等待)->重量级锁(syn、reeentrantLock)

比较:

偏向锁:  加锁解锁消耗极少,锁竞争的安全点带来消耗。      适用于一个线程

轻量级锁:响应快,自旋消耗cpu                                          追求响应时间,同步块非常快

重量级:                                                                              追求吞吐量,同步块执行时间长

|--处理器实现原子性策略:

LOCK#信号是一个线程独占共享内存(通过锁住主内存总线,之后优化成缓存锁)

缓存锁保证原子性

|--java原子实现:

锁和CAS

CAS局限性:ABA问题(过程无感知)、循环时间开销大、一次保证一个变量

|--内存模型(对底层抽象)

线程通信方式:

内存模型(共享内存)

消息传递(A复制到主内存,再从主内存写到B)

管道:输入流输出流(PipedReader,PipedWriter,PipedInputstream,PipedOutputStream)

内存模型:本地内存(共享变量副本、局部变量)、主内存(共享变量)

指令重排序:编译优化重排、并行重排、内存重排

|--final域重写规则

构造函数内,final写入与被构造的对象引用赋值不能重排序(obj=this会引发逃逸,例如此时别的线程调用obj.i,final的i变量还没初始化)

初次读含final域对象与随后读final区域不能重排

|--单例模式问题

实例化分为:1.开辟空间memory 2.初始化对象 3.设置instance指向memory。

指令重排可能是:1->3->2 , 若2还未执行,B线程认为instance非空,直接调用instance,导致错误

解决方案:1.volatile禁止重排序 2.匿名内部类(连自己加锁都不用,类自带实例化锁)

|--为什么使用多线程

1.多处理器发挥功效

2.更快相应,一个下订单带来一系列操作如何快速成功:线程派发,分任务执行

|--java优先级

不一定有用,主要是靠操作系统底层实现

|--interrupt

interrupt不会真的终止,只是一种协作机制

interrupt()将会设置该线程的中断状态位,即设置为true

使用Thread.currentThread().isInterrupted()方法(因为它将线程中断标示位设置为true后,不会立刻清除中断标示位,即不会将中断标设置为false)

thread.interrupted()(该方法调用后会将中断标示位清除,即重新设置为false)

一个线程处于了等待状态(thread.sleep、thread.join、thread.wait),则在线程在检查中断标示时如果发现中断标示为true,则会在这些阻塞方法调用处抛出InterruptedException异常,并且在抛出异常后立即将线程的中断标示位清除,即重新设置为false。抛出异常是为了线程从阻塞状态醒过来,并在结束线程前让程序员有足够的时间来处理中断请求。

锁的情况下不会被中断影响

|--阻塞状态与等待区别

阻塞是进锁里,等待是wait、sleep。sleep设置时间状态叫做超时等待状态

|--线程的应用

1.等待之后超时

while(结果未返回 && 时间未到)

wait();

2.线程池

要有队列,状态

Worker实现Runnable接口,循环从jobs队列取任务执行,获取不到就wait();

execute(Job job)时,唤醒jobs

3.基于线程池Web服务器

思路:开一个Socket服务,每次accept后,把这个一对一服务放封装成job类,放到jobs队列里

|--LockSupport

工具类,有park、unpark阻塞唤醒线程

|--Condition

相当于Lock中的wait和notify,区别是wait等待队列只能有一个,Condition可以有多个

Condition队列类似于AQS队列

每个Condition下面有一个等待await的等待队列

Lock.newCondition()获取condition

Lock.await(); = wait

Lock.singal();=notify

|--ConcurrentHashMap

问题:HashMap线程不安全导致Entry链表编程环,引发死循环。

HashTable效率低

解决:Segment包含HashEntry数组

Segment是一种可重入锁(ReentrantLock)

实现:segment数量是2的n次方,默认16

每一个segment的容量=每个segment里HashEntry*负载因子

如何放入数据:再散列确保数据分散后放入segment

get方法:不加锁,而是用volatile

1.8更新:没有了segment,横向用Node链表替代,Node被调用取时就synchronize加锁。当没Node底下链表超过8个,将加锁

|--ConcurrentLinkedQueue

非阻塞

入队:定位尾节点,不成功cvs重试(为了减少CVS,控制尾节点更新频率)

出队:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/323513.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

错误代码:88000, 错误信息:without comment privilege hint: [7oJ0533w689] rid: 630432cd-15944cf6-083e04fc

大家好,我是雄雄。 问题复现 这个问题,是我在操作:给微信公众平台上添加图文到草稿箱时,遇到的。 报错信息如下: {"errcode":88000,"errmsg":"without comment privilege hint: [7oJ0533w6…

asp.net core AuthenticationMiddleware 在WebApi中的的使用

在.net framework 4.5架构下使用认证(Authentication)授权(Authorization)。IIS使用HttpModule进行认证(Authentication),我们可以选择自己实现认证方式并在web.config中配置,当然也可以选择IIS默认提供的几…

初衷以及目的

因为我学的是软件工程专业的嘛,当初高考误打误撞选择了这门专业,也算是满意吧,毕竟自己对计算机还是挺感兴趣的。 很早以前我就想把计算机学好,希望用华丽的编程技术去创造有趣的游戏,但一直因为各种因素直到高三我才…

P1032-字串变换【bfs】

正题 评测记录:https://www.luogu.org/recordnew/lists?uid52918&pidP1032 题目大意 给若干个变化规则,表示A中的axa_xax​子串可以变化为bxb_xbx​中的子串,求至少要多少次变化才可以变为B子串。 解题思路 暴力广搜用mapmapmap库判重。 codecod…

WebSocket In ASP.NET Core(二)

Introduce上篇博文中,介绍了WebSocket的基本原理,以及一个简单的Demo用来对其有一个大致的认识。这篇博文讲的是我们平常在网站上可能会经常遇到的——实时聊天,本文就是来讲在.NET-Core使用WebSocket来实现一个“乞丐版”的在线实时聊天Demo…

不支持POST请求方法,支持以下GET、

大家好,我是雄雄。 刚刚在用**FeignClient**注解的时候,报了个错,不支持POST请求方法,支持以下GET、。 字面意思上看,好像是让把请求方式从post改成get. 但是,我检查了下我的代码,get提交方式…

Java面试之数据库面试题

转载自 Java面试之数据库面试题 1、触发器的作用? 触发器是一中特殊的存储过程,主要是通过事件来触发而被执行的。它可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化。可以联级…

P3701 -「伪模板」主席树【网络流,最大流】

正题 评测记录:https://www.luogu.org/recordnew/lists?uid52918&pidP3701 题目大意 给出若干个人的克制关系 给出两边每个人的种类和血量。当两个人pkpkpk后,双方各−1hp-1hp−1hp,同一边的YYYYYYYYY可以给每个同一方的J1hpJ\ 1hpJ 1hp&#xf…

给数组调换顺序

#include<stdio.h> main(){int i,j,t,a[]{1,2,3,4,5};i0;j4;while(j>i){ta[i];a[i]a[j];a[j]t;i;j--;}for(i0;i<5;i){printf("%d ",a[i]);} }1、注意a【】里面的值&#xff0c;后面有大括号可以不写了&#xff0c;写小了反而错了&#xff0c;如果要写后…

微服务如何实现各个模块之间相互调用

大家好&#xff0c;我是雄雄&#xff0c;现在是:2022年8月23日21:08:53 前言 在做微服务项目时&#xff0c;我们可能都会遇到这样的情况&#xff0c;那就是A服务需要调用B服务中的某个接口&#xff0c;那有这样的需求时&#xff0c;我们应该怎么处理呢&#xff1f; 实现 使用…

2017年秋招美团Java程序员开发,看我如何拿到offer

转载自 2017年秋招美团Java程序员开发&#xff0c;看我如何拿到offer 本人是一名本科毕业非计算机专业的程序员&#xff0c;面了阿里&#xff0c;结果没过&#xff0c;最后面上了美团&#xff0c;热乎乎的面经&#xff0c;昨天面的美团&#xff0c;虽然面完了HR面&#xff0c…

ASP.NET Core 运行原理剖析

1.1. 概述在ASP.NET Core之前&#xff0c;ASP.NET Framework应用程序由IIS加载。Web应用程序的入口点由InetMgr.exe创建并调用托管。以初始化过程中触发HttpApplication.Application_Start()事件。开发人员第一次执行代码的机会是处理Application_StartGlobal.asax中的事件。在…

nssl1155-遨游【二分答案,SPFA】

正题 题目大意 有若干个省&#xff0c;每个省有些城市&#xff0c;每个省有优惠Xi%X_i\%Xi​%&#xff0c;若在i省内的道路就优惠Xi%X_i\%Xi​%&#xff0c;若在i到j省的道路就优惠(Xi%Yi%)2\frac {(X_i\%Y_i\%)}22(Xi​%Yi​%)​&#xff0c;求一个区间[L,R][L,R][L,R]边权在…

使用wxJava开发微信服务(公众)号,实现新建素材的功能

大家好&#xff0c;我是雄雄。 前言 微信服务&#xff08;公众号&#xff09;号开发&#xff0c;前面已经整理过了几篇文章了&#xff0c;如下&#xff1a; java实现微信服务&#xff08;公众&#xff09;号用户关注时&#xff0c;获取openid&#xff0c;安全模式下的加密解密…

经典指针程序互换(一)

#include<stdio.h> huan(int *p,int *q){int t;t*p;*p*q;*qt;}int main(){ int a3,b10; huan(&a,&b);printf("%d %d",a,b); }这里我最疑惑的是不是改变*p的值就改变了a的值&#xff0c;为此&#xff0c;我专门敲了段代码&#xff0c;验证一下 #inclu…

Spring MVC 到底是如何工作的

转载自 Spring MVC 到底是如何工作的 这篇文章将深入探讨Spring框架的一部分——Spring Web MVC的强大功能及其内部工作原理。 这篇文章的源代码可以在GitHub上找到。 项目安装 在本文中&#xff0c;我们将使用最新、最好的Spring Framework 5。我们将重点介绍Spring的经典…

Entity Framework中的字符串插值引发担忧

将内插字符串&#xff08;Interpolated Strings&#xff09;自动地转化为参数化SQL语句&#xff0c;这是Entity Framework Core 2提供的一个新特性。虽然该特性从设计上是为了避免出现SQL语句编写上的问题&#xff0c;但是有人担心这会导致更多的SQL注入攻击。下面给出一个正确…

jeecg-boot集成xxl-job调度平台,每秒/每分钟/手动都能执行成功,但是设置固定时间不触发?

大家好&#xff0c;我是雄雄。 目录 这里写目录标题目录bug说明解决bug的过程解决方法结论今天在用jeecg-boot集成了的xxl-job的时候&#xff0c;遇到了个奇葩的问题&#xff08;其实一点都不奇葩&#xff09;&#xff0c;投入了几个人&#xff0c;一起看这个问题&#xff0c;看…

nssl1156-今天你AK了吗?【康托展开,高精度,二分答案,树状数组】

正题 题目大意 求n个数的全排列的第k个。 解题思路 首先康拓逆展开 ∑ii<nxi(n−i)!\sum^{i<n}_i x_i(n-i)!∑ii<n​xi​(n−i)! 求每个时候第xxx大的数 然后因为n(n−1)!n!n(n-1)!n!n(n−1)!n! so我们可以直接用余数 这是n3n3n3时是序列&#xff0c;我们可以发现我…

指针数组(二)

#include<stdio.h> void f(int *pA,int len){int i;for(i0;i<len;i){printf("%d",*(pAi)); }printf("\n");}main(){int a[5]{1,2,3,4,5};int b[4]{5,4,3,2};f(a,5);f(b,3);} 我想不用指针直接用函数来输出&#xff0c;看下 #include<stdio.h…