目录
- 我的难点
- sychronizedList方法无法解决List遍历时线程不安全问题
- sychronizd同步块为什么可以解决List遍历时线程不安全问题
- 我的思考过程
我的难点
sychronizedList方法无法解决List遍历时线程不安全问题
关于慕课网的socket课程学习中,qiujuer老师在课程中讲到:
关于多线程操作时,利用sychronizedList方法解决List内部方法线程不安全问题,但是对于list遍历仍然会触发异常。难点*1为什么会触发异常呢?
sychronizd同步块为什么可以解决List遍历时线程不安全问题
接着老师又讲到其他解决方案,
在stop()方法内部添加synchronized同步块。stop()方法中用到了List的遍历操作。
然后在boradcast(String str)方法名上添加sychronized修饰。方法内部用到了List的遍历操作。难点*2为什么同步块可以解决List遍历时线程不安全问题呢?
我的思考过程
难点*1:为什么会触发异常呢?
【思路】先看看sychronizedList(List list)是一个什么方法。
点开源码看看:这个方法支持特定的List返回一个线程安全的List。
【源码结论】:对于synchronizedList方法返回的List ,对该返回的List进行遍历时,必须放在同步块内部。否则可能导致非确定性(non-deterministic)问题。
待考证*1为什么线程安全的一个List,在进行遍历操作时会触发线程不安全?
【我的思考】:
非确定性(non-deterministic)问题指什么问题?它和线程不安全有什么关系呢?什么是线程不安全呢?
【我的理解】:
- 非确定性问题指无法直接计算,只能间接“猜算”结果的一类问题。
- 非确定性问题中可能会有线程不安全的问题出现。
- 线程不安全指:在多线程情况下,数据被先后更改多次导致脏数据。
【我的思考】:
源码讲到synchronizedList方法返回的List进行遍历操作时会有非确定问题,没有讲到线程不安全的问题。
【进一步思考】:
但是,源码建议这部分遍历要放到同步块中,说明synchronized同步块可以解决这部分的非确定问题,这部分问题主要是指线程不安全问题吗?同步块可以解决线程不安全问题吗?
【我的理解】:
- 这里的非确定问题主要指的是synchronizedList方法返回的List在遍历时导致线程不安全问题,因为必须使用同步块来解决这部分问题。
- 推测此处同步块可以解决线程不安全问题。
【我的思考】:
synchronizedList方法返回的List就是一个线程安全的list,所以遍历这个list会破坏了这个返回的list的的线程安全吗?
【我的理解】:
- 源码讲到返回的list在遍历时会出现非确定性问题,必须加上同步块。所以要看看使用同步块解决了什么问题。
难点*2为什么同步块可以解决List遍历时线程不安全问题呢?
思考:为什么遍历时线程会不安全呢?
未完待续。