前言
多线程并发问题,根本是面试必问的。
往年刚刚毕业筹备找实习的同学或者经验过最近一段时间面试的敌人们,相应你们应该都有一个雷同的问题被问到,那就是多线程与高并发
因为最近和腾讯、阿里包含字节和京东等一线大厂的面试负责人敌人在聊天的时候,他们给我独特的倡议就是在面试的时候都要问一下对于多线程和高并发的了解,因为这些技术的了解决定了他们的我的项目在做的时候,他们所负责的局部深刻到了什么水平。
置信说到这里,有很多敌人会回忆本人的对于这些常识的了解,后果怎么样呢?
大部分同学应该都晓得 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.com/biws-byte/bws
有视频和文档,有须要的敌人,去查看吧,或者间接私信“学习”查看获取形式
关注公众号:Java 架构师联盟,每日更新技术好文