1. 死锁
1.1 概述
死锁:就是在执行过程中,都遇到了对方进入加锁的方法中,从而导致大家都访问不了的状态
原理:1 某一个线程执行完成,需要先后嵌套锁定执行两个对象,并且在这个过程中,先锁定第一个对象
2 另一个线程执行完成, 需要先后嵌套锁定执行两个对象,并且在这个过程中,先锁定第二个对象
3 在第一个线程执行到第二个对象的时候,发现已经被锁定,只能等待
4 在第二个线程执行到第一个对象的时候,发现已经被锁定,只能等待
2. 线程通信
2.1 概述
wait:让该线程进入等待状态,会释放持有的锁
无参或者传入0,表示一直等待,不会自动唤醒,只能等着notify唤醒它
也可以传入long类型的值,类似于sleep,时间到了自己唤醒
notify:随机唤醒一个在该对象中正在等待的一个线程
notifyAll:唤醒在该对象中所有等待的线程
以上方法只能用在加锁的成员方法中
2.2 生产者和消费者
生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。
模式:
生产者消费者模型具体来讲,就是在一个系统中,存在生产者和消费者两种角色,他们通过内存缓冲区进行通信,生产者生产消费者需要的资料,消费者把资料做成产品。生产消费者模式如下图。
3. 单例模式
单例模式:让某个类只实例化一个对象
构造方法私有化,静态变量保存对象,公共的静态方法用于获取类对象
饿汉模式在多线程环境下没问题,因为不管多少线程,类只能被加载一次,所以只会被初始化一下,也就意味着只能创建一个对象
volatile:防止指令重排
4.线程池
线程池的作用:
线程池作业就是限制系统中执行线程的数量,根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果,少了浪费了系统资源,多了造成系统拥挤,效率不高,用线程池控制线程数量,其他线程排队等候,一个任务执行完毕,再从队列中取最前面的任务开始执行, 若队列中没有等待进程,线程池的这一资源处于等待, 当一个新任务需要运行时,如果线程池中有等待的工作线程,就可以开始运行
否则进入等待队列
好处:1.提高响应速度
2.降低资源消耗
3.便于线程管理
corePooiSize:核心池的大小
maximumPoolSize:最大线程数
keepAliveTime:线程没有任务时最多保持多长时间后会终止
线程池API:
Executors.newCachedThreadPool():创建一个可根据需要创建新线程的线程池
Executors.newFixedThreadPool(); 创建一个可重用固定线程数的线程池
Executors.newSingleThreadExecutor() :创建一个只有一个线程的线程池
Executors.newScheduledThreadPool():创建一个线程池,它可安排在给定延迟后运行命令或 者定期地执行。