可以使用一种办法使一个handler的操作只能分派到一个线程中:为每一个handler设定一个线程所有者ID,一开始ID为空,则每个线程都可以分派,第一次分派之后,则设定为该线程ID,以后只分派到该线程中。这样,可以保证handler操作的单线程性,简化以后handler的具体实现。这个ID也可以灵活设置,以适应具体事务的要求。
但这样并不能保证handler彻底无锁,因为还会有两个线程会出现竟争,除了这个事件处理线程以外,还有事件分派线程(即事件侦听线程)。对于这个问题的解决办法如下:为每个handler设定一个原子计数,事件分派线程在分派事件前,首先设定该原子计数,若设置失败,表明此时正有其它线程在处理该handler,则并不分派该事件,而是将它置于一个pending队列中,等待以后分派。