这种线程间通信场景如何实现?
济南大飞哥 2018-08-28 12:05:15 1、有一个ConcurrentHashMap<Integer,String>,有一个线程会不断的往里面set id、value
2、有多个线程去get(id),get不到就等待,get到就remove。
每个线程传递的id不同,set进去的id每次也是不同的,最终能一一对应上。
我想到的方案是
1、ReentrantLock,读取线程需要获取锁,然后get,get不到await释放锁。使用ReentrantLock的condition实现线程间通信。
2、set方法每次set后signalall()读线程。
典型的一写多读,并发变成串行的方法,已经验证可行。
观察我的场景,get的时候传递的id能确定每次是不同的,set进去的id每次也是不同的,最终能一一对应上。
所以我想改成
1、get 并行执行,如果get不到等待。
2、set方法,set完毕能通知/或者唤醒 get线程。
也即是说方案一的性能我认为有提高的空间,get的时候,每个人get自己的,完全不应该串行,而且使用ReentrantLock+condition,读与写之间也得争用锁,性能应该有损失。
我想到用一个list<object>来存储锁,每个get线程自己new一个对象,存入list中, 然后锁住这个对象,get不到,就wait;set方法每次set完,遍历list,依次锁住后,notifyall。
这个方案还没有验证,我觉得主要的问题是使用了object的wait、notifyall,不够优雅,二是比起方案一多了一个list,增加了复杂性。不知道还有没有其他方案。