多线程的概念:
进程:电脑中时不时的会有很多单独的运行的程序,每个程序都有一个独立的进程,而进程之间是相互独立存在的
线程:进程想要执行任务就需要依赖线程。换句话说,就是进程中的最小执行单位就是线程,并且一个进程至少有一个线程
线程里面两个很重要的概念:
串行:单条线程来执行多个任务,按照一定的顺序一个个执行
并行:多条线程同时执行某一个任务,在时间上是重叠的 eg:单刷boss和组队刷boss
线程安全: 当多个线程访问某个方法的时候,不管你通过怎样的调用方式、或者说这些线程如何交替的执行,我们在主程序中不需要去做任何的同步,这个类的结果行为都是我们设想的正确行为,那么我们就可以说这个类是线程安全的。
eg:boss掉落了一件装备,大家同时去拾取,只能有一个人先抢到。
如何保证线程安全
1.synchronized:synchronized关键字,就是用来控制线程同步的,保证我们的线程在多线程环境下,不被多个线程同时执行,确保我们数据的完整性,可以将这个关键字加载方法上面,也可以加载代码块上面。
2.ReentrantLock:ReentrantLock是咋java1.6的时候被引入进来的,使用它需要我们手动获取锁和释放锁,他提供终端获取以及超市获取的同步特性
3.Redis锁:结合setnx命令实现,指定的key不存在时,为key设置指定的值,设置成功返回1,设置失败返回0.
4.Redission:封装了redis很懂原生方法,并提供分布式环境的各种实现,RLock就是一个锁实现。
5.原子类:java.util,concurrent.atomic包下有很多封装好的原子类。
多线程的应用场景
多线程的实现方式
1.实现Runnable接口
2.继承Thread类
3.实现Callable接口
4.使用JDK自带Executor框架,不够灵活,有局限性