1. 守护线程
每个程序运行时,都会有一个守护线程同步启动,用于监听我们的正常程序
当主线程序执行完之后,守护线程也就没有存在的价值了;因为没有工作可做,此时,JVM就会关机,守护线程终止。
我们可以通过 线程对象 . setDaemon(true) 来把某个线程设置为守护线程(必须在启动之前设置)
2. 死锁
2.1. 概述
死锁:死锁就是在程序执行过程中,都遇到了对方进入加锁的方法中,导致大家都访问不了
原理:
1.某个线程执行完成,需要 先后 嵌套 锁定 执行两个对象,同时在这个过程中,先锁定第一个对象,在锁定第二个对象
2.另外一个线程执行完成之后,需要 先后 嵌套 锁定 执行两个对象,同时在这个过程中,先锁定第二个对象,在锁定第一个对象
3.在第一个线程,锁定第一个对象后,要去锁定第二个对象时,发现第二个对象已经被锁定,只能等待
4.第二个线程,锁定第二个对象后要去锁定第一个对象时,发现第一个对象已经被锁定,只能等待
2.2. 代码实现
3. 线程通信
3.1. 概述
Object中的方法
wait():让该线程进入等待状态(挂起状态),当被唤醒后,进入就绪状态,然后再次执行时,紧接着之前挂起的地方继续执行
无参 或传入参数0 都表示不会自动唤醒,只能被唤醒(notify,notifyAll)
也可以传入long类型的值,代表毫秒数,到指定毫秒数之后,自动唤醒
wait和sleep的区别:sleep不会交出锁,依然占用锁,其他线程无法进入,wait会交出锁,其他线程可以进去
notify():随机唤醒一个在该对象上等待的一条线程,让别的线程去执行
notifyAll():唤醒所有在该对象上等待的线程
以上方法必须用在成员方法中,且该方法必须加锁(synchronized)
3.2. 使用方式
3.3. 生产者和消费者
消息队列:生产者/消费者模式_生产者消费者队列-CSDN博客
降低耦合度
例:
4. 单例模式
https://www.cnblogs.com/dolphin0520/p/3920373.html
懒汉模式:在多线程环境下可能出现问题,所以一般采用双重校验+代码块锁机制来解决处理
volatile:防止指令重排