线程

本文深入探讨了线程互斥与同步的概念,解析了线程如何通过对象锁实现互斥,以及如何利用wait(), notify(), notifyAll()等方法进行线程间的通信,确保线程按预期顺序执行,避免死锁等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

线程
一:线程互斥
并发访问的线程加上同步锁之后就称为线程互斥。
谁抢到了对象锁的线程就先执行。
没有抢到对象锁的线程就等待对象锁。
加同步锁,加在共享对象上。
每一个对象都有唯一的一把锁。
lock对象锁---->执行代码------>unlock对象锁

synchronized(共享区){临界区}
共享区:多线程同时操作同一个对象
临界区:多线程对共享区进行操作的代码区
synchronized可以放在方法上,就是一个同步方法。

将所有影响的方法都定义成线程安全的方法就变成了线程安全的类。
线程安全的类—效率低

二:线程的通信—>线程同步(操作的也是同一个对象)
线程互斥谁先抢到对象锁就谁先执行(如抛绣球)。
线程同步会控制线程执行的先后顺序。
线程同步线程会有依赖关系。

线程通信的步骤:
1)找到共有对象。
2)wait(),notify(),notifyAll()—Object类中的方法。
需要对同一个资源等待,唤醒才有效。
是针对对象进行等待和通知。这些方法一定要放在
synchronized关键字中,用来保护共有资源。
生产者生成产品之后通知消费者–notify
消费者等待生产者生产产品—wait
3)保证wait()执行在notifyAll()方法的前面.使用标志变量。
notifyAll()之前先判断有没有线程在等待。
如果有就通知,没有就小睡一下只有有等待线程出现。

sleep():不会释放对象锁。
wait():让当前线程进入等待状态,会释放对象锁。
notify():通知等待中的某个线程进入到就绪状态。会释放对象锁。
notifyAll():通知等待中的所有线程进入到就绪状态。会释放对象锁。
yeild():不会释放锁,让出当前线程。进入就绪状态
临界区执行完毕:释放锁
临界区代码执行过程中遇到Error Exception释放
临界区代码执行过程中出现return,break 释放锁

三:线程的死锁
多个线程同时操作多个对象很容易产生死锁。
解决方式:给多个对象加对象锁的时候。
将加锁的顺序保持一致,就可以避免死锁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值