原子性:一个操作要么全部执行完成 (执行过程不能被任何因素打断),要么都不执行。(如:银行转账)
可见性:当多个线程同时访问共享变量时,一个线程修改了这个变量的值,其他线程能够看到最新修改的值。(如线程A修改了共享变量 i 后,还没有刷新到主内存,这时线程B 又使用了变量 i , 此时的变量 i 还是之前的值,这就是可见性问题)
有序性:处理器为了提高代码执行效率,可能会对代码进行重排序,他不保证程序中各个语句执行线后顺序和代码中的顺序一致,但会保证最终执行结果和代码顺序执行结果是一致的。重排序对单线程不会有问题,对多线程可能会出问题。
造成线程安全问题有两点因素:
存在共享变量;
多个线程同时操作共享变量;
解决方案:当多个线程操作共享变量时,需要保证同一时刻有且只有一个线程在操作共享变量,其他线程必须等到该线程处理完数据后再进行操作。
现如今市场,多线程、高并发编程、分布式、负载均衡、集群等可以说是现在高级后端开发求职的必备技能。很多人拥有大厂梦,却因为多线程与高并发败下阵来。实际上,多线程与高并发并不难,今天这份最全的多线程与高并发总结,助你向大厂“开炮”,面试不再被多线程与高并发难倒。
、 注意:关于多线程与高并发的内容整理,包括了面试题、学习笔记、使用文档以及Xmind思维图几个部分,高清完整版《多线程与高并发》
多线程与高并发面试题(基础部分)
ThreadLocal内存结构图
多线程与高并发面试题(高级进阶部分)
多线程与高并发面试答案解析
“高并发和多线程”总是被一起提起,给人感觉两者好像相等,实则高并发 ≠ 多线程
1.多线程
多线程是java的特性,因为现在cpu都是多核多线程的,可以同时执行几个任务,为了提高jvm的执行效率,java提供了这种多线程的机制,以增强数据处理效率。多线程对应的是cpu,高并发对应的是访问请求,可以用单线程处理所有访问请求,也可以用多线程同时处理访问请求。
在过去单CPU时代,单任务在一个时间点只能执行单一程序。之后发展到多任务阶段,计算机能在同一时间点并行执行多任务或多进程。虽然并不是真正意义上的“同一时间点”,而是多个任务或进程共享一个CPU,并交由操作系统来完成多任务间对CPU的运行切换,以使得每个任务都有机会获得一定的时间运行。
再后来发展到多线程技术,使得在一个程序内部能拥有多个线程并行执行。一个线程的执行可以被认为是一个CPU在执行该程序。当一个程序运行在多线程下,就好像有多个CPU在同时执行该程序。
总之,多线程即可以这么理解:多线程是处理高并发的一种编程方法,即并发需要用多线程实现。
2.高并发
高并发不是JAVA的专有的东西,是语言无关的广义的,为提供更好互联网服务而提出的概念。
典型的场景,例如:12306抢火车票,天猫双十一秒杀活动等。该情况的发生会导致系统在这段时间内执行大量操作,例如对资源的请求,数据库的操作等。如果高并发处理不好,不仅仅降低了用户的体验度(请求响应时间过长),同时可能导致系统宕机,严重的甚至导致OOM异常,系统停止工作等。
如果要想系统能够适应高并发状态,则需要从各个方面进行系统优化,包括,硬件、网络、系统架构、开发语言的选取、数据结构的运用、算法优化、数据库优化等……而多线程只是其中解决方法之一。
Java 高并发编程详解:多线程与架构设计
第一部分:多线程基础
主要阐述 Thread 的基础知识,详细介绍线程的 API 使用、线程安全、线程间数据通信,以及如何保护共享资源等内容,它是深入学习多线程内容的基础。
第二部分:Java ClassLoader
引入了 ClassLoader,这是因为 ClassLoader 与线程不无关系,我们可以通过 synchronized 关键字,或者 Lock 等显式锁的方式在代码的编写阶段对共享资源进行数据一致性保护,那么一个 Class 在完成初始化的整个过程到后在方法区(JDK8 以后在元数据空间)其数据结构是怎样确保数据一致性的呢?这就需要对 ClassLoader 有一个比较全面的认识和了解。
第三部分:深入理解volatile关键字
第三部分详细、深入地介绍 volatile 关键字的语义,volatile 关键字在 Java 中非常重要,可以说它奠定了 Java 核心并发包的高效运行,在这一部分中,我们通过实例展示了如何使用 volatile 关键字以及非常详细地介绍了 Java 内存模型等知识。
第四部分:多线程设计架构模式
站在程序架构设计的角度深入讲解了如何设计高效灵活的多线程应用程序,这一部分长达15个章节,其重要程度可见一斑。
《多线程与高并发》
第一节:线程的基本概念
第二节:volatile与CAS
第三节:Atomic类和线程同步新机制
第四节:LockSupport、淘宝面试题与源码阅读方法论
第五节:AQS源码阅读与强软弱虚4种引用以及ThreadLocal原理与源码
第六节:并发容器
第七节:线程池
第八节:线程池与源码阅读
第九节:JMH与Disruptor
多线程与高并发(Xmind)
Disruptor,基础概念,高频面试加分项,JUC同步工具,线程池,同步容器
总的来说,自己如果有想要去的大公司,一定要提升好自己,让自己的能力和素质与公司匹配的上,我也一直相信,机会永远是留给有准备的人。无论是学习还是工作,都应该有主动性,所以如果拥有大厂梦,那么就要自己努力去实现它。
最后祝愿各位顺利拿到心仪的offer!