多线程-面试

多线程:

 

多线程的概念:

进程:电脑中时不时的会有很多单独的运行的程序,每个程序都有一个独立的进程,而进程之间是相互独立存在的

线程:进程想要执行任务就需要依赖线程。换句话说,就是进程中的最小执行单位就是线程,并且一个进程至少有一个线程

线程里面两个很重要的概念:

串行:单条线程来执行多个任务,按照一定的顺序一个个执行

并行:多条线程同时执行某一个任务,在时间上是重叠的 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.map-reduce任务:多个线程运行map任务,可以是清晰数据、聚合数据等,在将处理后的数据reduce在一起。

2.群发短信、push、消息:平时的推广、活动通知之类的业务

3.下载、内容抓取:内容下载和一些信息内容抓取等业务

4.生产者消费者模式:应用内实现此模式就需要用到多线程,多个生产者和消费者。

多线程的实现方式

1.实现Runnable接口

2.继承Thread类

3.实现Callable接口

4.使用JDK自带Executor框架,不够灵活,有局限性

5.自定义配置ThreadPoolExector线程池,推荐

原文地址:https://www.cnblogs.com/dongyaotou/p/14585743.html