当利用多线程处理程序时,共有资源就是各个线程抢占的对象,处理加锁问题总结几点:
现象:
多线程抢占临界资源,会导致程序阻塞,影响效率如图:
经验和原因:
1. 能不加锁的地方,就不加锁,因为多线程同时抢占一个锁会发生阻塞,影响多线程的效率,而且处理不当会发生死锁
2. 被锁资源和代码段能短就尽量短,能用原子锁就用原子锁,被锁代码段如果很长的话,也就是被锁住的资源会很大,这样同一时间只允许一个线程占有他,这样对多线程而言效率被降低了很多,就像地铁门口的关卡一样,堵住了许多人,浪费了许多人的时间,程序也是一样,所以,让临界区尽量的小,保证程序的高效性
3. 选择锁时要慎重,根据需要,是选择互斥锁、信号量、还是事件锁。选择不当不但会会造成程序资源浪费,而且达不到预期的效果,所以选择锁之前要考虑再三。例如有限个资源可以用信号量,需要长时间等待的就用事件锁,单一资源用互斥锁
4. 多线程打印日志要加线程id,不然你不知道代码是哪个线程执行的
5. 处理同一个问题的多线程操作可以利用线程池,特别是处理生产者消费者问题时,特别是消费者处理比较慢的情况,这样不仅可以省去处理等待的时间,而且加快处理的速度