死锁、线程通讯、单例模式

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:防止指令重排

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值