线程安全问题

来源:5-7 实现聊天室监听器:ChatHandler(下)

刹那_0

2020-03-08

老师你好,有一个疑问。
即使你在对HashMap相关的addClient removeClient forwardMessage方法上都使用了synchronized,但是依然有可能在forwardMessage方法对Map的迭代中其他线程对Map进行了修改,从而导致ConcurrentModificationException。
不知道我的想法对不对。-.-

写回答

1回答

Stannum

2020-04-12

同学你好~你问出了一个非常典型的关于synchronized关键字的理解的问题~

只要想明白一件事,你就不会再为synchronized关键字发愁了:代码中的synchronized关键字加在非static函数上,所以同一时间不会有多个线程调用同一个对象的synchronized函数。

在ChatServer的代码中,你会留意到,我们每次创建一个新线程,都会把同一个server对象传入ChatHandler的构造函数中去。这就意味着,每一个线程中的handler对象都在调用同一个server对象的synchronized函数(addClient,removeClient,forwardMessage)。这是保证代码线程安全的关键。

2
0

系统学习Java网络编程 深度理解BIO/NIO/AIO

对比式学习助你真正理解BIO/NIO/AIO三大网络编程模型。

880 学习 · 148 问题

查看课程