前言
多线程并发问题,基本是面试必问的。
今年刚刚毕业准备找实习的同学或者经历过最近一段时间面试的朋友们,相应你们应该都有一个相同的问题被问到,那就是多线程与高并发
因为最近和腾讯、阿里包括字节和京东等一线大厂的面试负责人朋友在聊天的时候,他们给我共同的建议就是在面试的时候都要问一下对于多线程和高并发的理解,因为这些技术的理解决定了他们的项目在做的时候,他们所负责的部分深入到了什么程度。
相信说到这里,有很多朋友会回想自己的对于这些知识的理解,结果怎么样呢?
大部分同学应该都知道Synchronized,Lock,部分同学能说到volatile、并发包,优秀的同学则能在前面的基础上,说出Synchronized、volatile的原理,以及并发包中常用的数据结构,例如ConcurrentHashMap的原理。
这篇文章将总结多线程并发的各种处理方式,希望对大家有所帮助。
问题
1、开始之前,首先你要知道多线程和高并发都有哪些重点的知识要掌握吧
多线程
并发
知道了这些问题或者说知识点之后,接下来我们就要研究下一个问题
2、多线程为什么会有并发问题
为什么多线程同时访问(读写)同个变量,会有并发问题?
Java内存模型规定了所有的变量都存储在主内存中,每条线程有自己的工作内存。线程的工作内存中保存了该线程中用到的变量的主内存副本拷贝,线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存。线程访问一个变量,首先将变量从主内存拷贝到工作内存,对变量的写操作,不会马上同步到主内存。不同的线程之间也无法直接访问对方工作内存中的变量,线程间变量的传递均需要自己的工作内存和主存之间进行数据同步进行。哪知道了多线程并发问题的产生原因之后,接下来是不是就是要解决呀,今天的重点不是说解决方案,所以今天就不详细了,想知道详细解答方案的,可以下方,评论,我文章整理
面试
我们知道,平时敲代码牛逼的朋友,但是在面试的时候就卡壳,最后获得的职级和薪水可能还不如比他技术稍微差点的朋友,那原因在哪里呢?可能就是差在应试技巧上,毕竟在面试的时候不可能让你现场敲代码不是,那对于这些问题又该如何回答呢
当只有一个线程写,其它线程都是读的时候,可以用volatile修饰变量当多个线程写,那么一般情况下并发不严重的话可以用Synchronized,Synchronized并不是一开始就是重量级锁,在并发不严重的时候,比如只有一个线程访问的时候,是偏向锁;当多个线程访问,但不是同时访问,这时候锁升级为轻量级锁;当多个线程同时访问,这时候升级为重量级锁。所以在并发不是很严重的情况下,使用Synchronized是可以的。不过Synchronized有局限性,比如不能设置锁超时,不能通过代码释放锁。ReentranLock可以通过代码释放锁,可以设置锁超时。高并发下,Synchronized、ReentranLock效率低,因为同一时刻只有一个线程能进入同步代码块,如果同时有很多线程访问,那么其它线程就都在等待锁。这个时候可以使用并发包下的数据结构,例如ConcurrentHashMap,LinkBlockingQueue,以及原子性的数据结构如:AtomicInteger。
面试的时候按照上面总结的这个思路回答基本就ok了。既然说到并发包,那么除了ConcurrentHashMap,其它一些常用的数据结构的原理也需要去了解下,例如HashMap、HashTable、TreeMap原理,ArrayList、LinkedList对比
而除了多线程与高并发,技术之间的连贯性,也会引出其他的相关问题,我们来看一下
操作系统
由多线程和高并发引出的第一个问题就是操作系统的相关内容
接下来
Java基础
有了基础怎么能少了jvm调优
jvm调优
调优方面,怎么能少了mysql呢
mysql
mysql优化
spring
spring当然也要来凑凑热闹
网络
消息队列
这些资料我已经整理到我的git中:github.