上次写的SocketManager中的SocketServer最近出现个问题。
偶尔会报 “集合已修改;可能无法执行枚举操作。”错误。
首先想到的是没有锁定集合对象。
所以先尝试 lock(alSock){}
lock关键字用法,多线程共用对象时,操作对象时锁定对象,这样如果有别的线程访问对象,则自动加入队列等待。确保对象操作过程中准确性。
但是问题依旧,后来突然想起来foreach是只读的,集合如果变更就会出这个问题
于是把foreach改为 for(int i =0) 后,问题解决
foreach是取只读的,在取的时候数据不能变(包括修改,删除,添加等)。要避免这个问题,就应该使用for循环。