一、什么是线程安全问题 二、线程安全问题发生的原因 简答来说,就是多个线程同时访问同一个共享资源并修改该资源。 三、线程同步 1)线程同步解决安全问题的核心思想: 加锁使得多个线程必须先后依次访问共享资源。 2)加锁的3种方式: 方式1:synchronized同步代码块 上锁需要用到synchronized关键字,如果不了解这个关键字,暂时只需要知道它是用来上锁的就行。在使用synchroniezed关键字上锁的时候,需要传入一个对象,这个对象被称为锁对象。 在锁对象的选择上,最好不要选择一些唯一的对象(比如字符串等): 总结(同步代码块): 方式2:synchronized同步方法 刚才的锁是加在代码块中的,而现在是加在方法上的。 同步方法的底层原理: 同步代码块和同步方法进行比较: 同步代码块锁住的范围比同步方法小,理论上来说效率会比同步方法好一点,但同步方法写起来比较方便,所以同步方法更常用,一般推荐使用同步方法。 总结(同步方法): 方式3:Lock锁 什么是Lock锁: Lock锁常用API: 具体使用步骤: ① 新建Lock对象,如: 这里使用final修饰锁,是为了防止锁被修改导致失效。 ② 在需要锁上的代码前调用lock()方法上锁,在代码之后调用unlock()方法解锁。 注意,最好将代码写在一个try-catch-finally中,并且将解锁操作写在finally块中,这样是为了防止代码出现异常导致锁一直没有被释放的情况发生。 四、线程通信
- 什么是线程通信:
- 线程通信常见模型:生产者与消费者模型:
- 线程通信常用的方法:
注意: ① 如果要唤醒其他线程,并使当前线程进入等待状态,要记得把唤醒操作写在调用wait()方法之前。因为调用wait()之后线程就进入等待状态了,之后的代码暂时都不会被执行了,简单来说,就是wait()之后你自己已经晕过去了,更不用说叫醒其他人了。 总结:
参考资料: https://www.bilibili.com/video/BV1Cv411372m
|