线程安全问题
来源: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)。这是保证代码线程安全的关键。
20
相似问题