栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【Java】线程安全问题与线程通信

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【Java】线程安全问题与线程通信

一、什么是线程安全问题

二、线程安全问题发生的原因

简答来说,就是多个线程同时访问同一个共享资源并修改该资源。
三、线程同步
1)线程同步解决安全问题的核心思想:
加锁使得多个线程必须先后依次访问共享资源。
2)加锁的3种方式:
方式1:synchronized同步代码块

上锁需要用到synchronized关键字,如果不了解这个关键字,暂时只需要知道它是用来上锁的就行。在使用synchroniezed关键字上锁的时候,需要传入一个对象,这个对象被称为锁对象。
在锁对象的选择上,最好不要选择一些唯一的对象(比如字符串等):

总结(同步代码块):

方式2:synchronized同步方法
刚才的锁是加在代码块中的,而现在是加在方法上的。

同步方法的底层原理:

同步代码块和同步方法进行比较:
同步代码块锁住的范围比同步方法小,理论上来说效率会比同步方法好一点,但同步方法写起来比较方便,所以同步方法更常用,一般推荐使用同步方法。
总结(同步方法):

方式3:Lock锁
什么是Lock锁:

Lock锁常用API:

具体使用步骤:
① 新建Lock对象,如:
这里使用final修饰锁,是为了防止锁被修改导致失效。
② 在需要锁上的代码前调用lock()方法上锁,在代码之后调用unlock()方法解锁。
注意,最好将代码写在一个try-catch-finally中,并且将解锁操作写在finally块中,这样是为了防止代码出现异常导致锁一直没有被释放的情况发生。
四、线程通信

  1. 什么是线程通信:
  2. 线程通信常见模型:生产者与消费者模型:
  3. 线程通信常用的方法:

    注意:
    ① 如果要唤醒其他线程,并使当前线程进入等待状态,要记得把唤醒操作写在调用wait()方法之前。因为调用wait()之后线程就进入等待状态了,之后的代码暂时都不会被执行了,简单来说,就是wait()之后你自己已经晕过去了,更不用说叫醒其他人了。
    总结:

参考资料:
https://www.bilibili.com/video/BV1Cv411372m

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/831035.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号