2020-8-3 第八组 曹雨 多线程 锁
锁:
1.synchronized关键字的锁
处理多线程并发编程。
重量级锁,JDK1.6进行了优化。
有三种方式加锁:
- 修饰实例方法,作用于当前实例加锁,进入同步代码前要获得当前实例的锁
- 静态方法,作用于当前类对象加锁,进入同步代码前要获得的当前类对象的锁
- 同步代码块,可以指定加锁对象,进入同步代码块之前要获得给定对象的锁
锁对象:
- 实例方法:调用该方法的实例
- 静态方法:类对象
- this:调用该方法的实例对象
操作共享数据的代码
共享数据:多个线程共同操作的变量
同步方法:
- 同步方法依然会涉及到同步锁对象,不需要我们写出来
- 非静态的同步方法,同步锁就是this
- 静态的同步放发
同步代码块:
1.选好同步监视类,推荐使用类对象,第三方对象,this
2.在实现接口创建的线程中,同步代码㐓和使用this
3.同步的方式,解决线程安全的问题。操作同步代码时,只有一个线程能够参与,其他线程等待。相当于一个单线程的过程,效率低。
只能针对JVM可以(解决d)
死锁:
多个线程同时被阻塞,他们中的某个或者全部都在等待某个资源的释放,由于线程无限期的阻塞,程序就不可能终止(互相拿着对方要的资源不释放)
产生的必要条件:
-
互斥使用:
当资源被一个线程占用,别的线程不能使用 -
不可抢占:
资源的请求着不能强制从占有者手中抢夺资源,资源只能从占有者手动释放 -
请求和保持:一别找别人帮你,一边继续要资源
-
循环等待:存在一个等待对列:P1占有P2的资源,P2占有P3资源,P3占有P1的资源,形成一个等待环路
如果上述条件全部满足就会造成死锁,任何一条不满足,死锁都会失效
线程重入
任意线程在拿到所后,再次获得该锁不会被该锁锁阻碍
线程不会被自己锁死的
这就叫做线程的重入,synchronized可重入锁
1.无锁:不加锁
2.偏向锁:不锁锁,当只有一个线程争夺时,我们会偏向某一个线程,这个线程不加锁
3.轻量级锁:少量线程来了之后,先尝试自旋,不挂起线程。
4.重量级锁:排队挂起(暂停)线程。
挂起线程和恢复线程需要转入内核态中完成这些操作,给系统的并发性带来很大压力,在很多应用上共享数据的锁定状态,只会持续很短的时间,为了这段时间去挂起和恢复并不值得。我们可以只让后面线程执行一个循环,自旋。
Object类对多线程的支持:
wait():
wait (long timeout):当前线程进入等待状态
notify():唤醒正在等待的下一个线程
notifyAll():唤醒正在等待的所有线程。
线程间的通信
比如两条线程,共同运行。
线程A如果先走,线程B就要等待,等待线程A走完,唤醒线程B,线程B再走
方法总结:
1.Thread的两个静态方法
sleep释放CPU资源,但是不会释放锁
yield方法释放CPU执行权,保留了CPU的执行资格,不常用。
2.join方法,yield让出执行权,join就会进来
3.wait:释放CPU资源,释放锁
notify:唤醒等待中的进程
notifyAll:唤醒所有等待中的进程
面试题
sleep()和wait()的区别:
- sleep()是Thread类里的,wait()是Object里的
- sleep()是计时等待,wait()是永久等待
- 在调用sleep时会释放对象锁,在调用wait时,不会释放对象锁
线程的退出
使用退出标志,线程正常退出,run方法结束后线程终止。
stop
interrupt中断线程
线程的常用方法
1.start:启动当前线程:执行run方法
2.run方法
3.currentThread:静态方法,获取当前正在执行的进程(有返回值,返回值是Thread对象);
4.getId()
5.setName()
6.getName()
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!