一、什么是线程安全问题
二、线程安全问题发生的原因
简答来说,就是多个线程同时访问同一个共享资源并修改该资源。
三、线程同步
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



