为什么用多线程?
在操作系统级别上,程序的执行都是以进程为单位,而每一个进程中通常都会有多个线程线程互不影响地并发执行,那么为什么要使用多线程呢?其实,多线程的使用为程序研发带来了巨大的便利,具体而言,有以下几方面的内容:
(1)使用多线程可以减少程序的响应时间。在单线程(单线程指的是程序执行过程中只有一个有效操作的序列,不同操作之间都有明确的执行先后顺序)的情况下,如果某个程序很耗时或者陷入长时间等待(如等待网络响应),此时程序将不会相应鼠标和键盘等操作,使用多线程后,可以把这个耗时的线程分配到一个单独的线程去执行,从而是程序具备了更好的交互性。
(2)与进程相比,线程的创建和切换开销更小。由于启动一个新的线程必须给这个线程分配独立的地址空间,建立许多数据结构来维护线程代码段、数据段等信息,而运行于同一个进程内的线程共享代码段、数据段,线程的启动或切换的开销就比进程要少很多。同时多线程在数据共享方面效率非常高。
(3)多CPU或多核心计算机本身就具有执行多线程的能力,如果使用单个线程,将无法重复利用计算机资源,造成资源的巨大浪费。因此在多CPU计算机上使用多线程能提高CPU的利用率。
(4)使用多线程能简化程序的结构,使用程序便于理解和维护。一个非常复杂的进程可以分成多个线程来执行。
这里分享一份独角兽大牛纯手肛出的一份多线程实战文档,内容干货满满,千万别把它丢进收藏夹吃灰
一、什么是多线程
1.初识多线程
1.1介绍进程
1.2回到线程
1.3进程与线程
1.4并行与并发
1.5Java实现多线程
1.5.1继承Thread,重写run方法
1.5.2实现Runnable接口,重写run方法
1.6Java实现多线程需要注意的细节
二、Thread类解析
1.Thread线程类API
1.1设置线程名
1.2守护线程
1.3优先级线程
1.4线程生命周期
1.4.1sleep方法
1.4.2yield方法
1.4.3join方法
1.4.3interrupt方法
、
三、使用多线程需要注意的问题
1、使用多线程遇到的问题
1.1线程安全问题
1.3性能问题
2、对象的发布与逸出
2.1安全发布对象
3、解决多线程遇到的问题
3.1简述解决线程安全性的办法
3.2原子性和可见性
3.2.1原子性
3.2.2可见性
3.3线程封闭
3.4不变性
3.5线程安全性委托
4、多线程需要注意的事 -总结
四、synchronized锁和lock锁
1、synchronized锁
1.1synchronized锁是什么?
1.2synchronized用处是什么?
1.3synchronized的原理
1.4synchronized如何使用
1.4.1修饰普通方法法:
1.4.2修饰代码块:
1.4.3修饰静态方法
1.4.4类锁与对象锁
1.5重入锁
1.6释放锁的时机
2、Lock显式锁
2.1Lock显示锁简单介绍
2.2synchronized锁和Lock锁使⽤哪个
2.3公平锁
3、Java锁简单总结
五、AQS
1、AQS是什么?
2、简单看看AQS
2.1同步状态
2.2先进先出队列
2.3acquire方法
2.4release方法
六、ReentrantLock和ReentrantReadWriteLock
1、ReentrantLock锁
1.1内部类
1.2构造方法
1.3非公平lock方法
1.4公平lock方法
1.5unlock方法
2、ReentrantReadWriteLock
2.1ReentrantReadWriteLock内部类
2.2读锁和写锁的状态表示
2.3写锁的获取
2.4读锁获取
3、最后
七、线程池
1、线程池简介
2、JDK提供的线程池API
2.1ForkJoinPool线程池
2.2补充:Callable和Future
3、ThreadPoolExecutor详解
3.1内部状态
3.2已默认实现的池
3.2.1newFixedThreadPool
3.2.2newCachedThreadPool
3.2.3SingleThreadExecutor
3.3构造方法
4、execute执行方法
5、线程池关闭
八、死锁
1、死锁讲解
1.1锁顺序死锁
1.2动态锁顺序死锁
1.3协作对象之间发生死锁
2、避免死锁的方法
2.1固定锁顺序避免死锁
2.2开放调用避免死锁
2.3使用定时锁
2.4死锁检测
3、死锁总结
九、线程常用的工具类
1、CountDownLatch
1.1CountDownLatch简介
1.2CountDownLatch例子
2、CyclicBarrier
2.1CyclicBarrier简介
2.2CyclicBarrier例子
3、Semaphore
3.1Semaphore简介
3.2Semaphore例子
4、总结
十、Atomic
1、基础铺垫
1.2CAS再来看看
1.2.1CAS失败重试(⾃旋)
1.2.2CAS失败什么都不做
2、原子变量类简单介绍
2.1原子变量类使用
2.2ABA问题
2.3解决ABA问题
2.4LongAdder性能比AtomicLong要好
十一、ThreadLocal
1、什么是ThreadLocal
2、为什么要学习ThreadLocal?
2.1管理Connection
2.2避免一些参数传递
3、ThreadLocal实现的原理
3.1ThreadLocal原理总结
4、避免内存泄露
5、总结