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()

posted on   figh466  阅读(17)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!

导航

< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8
点击右上角即可分享
微信分享提示