一、如何避免死锁
当两个线程同时等待对方释放资源时,就出现了死锁。Python解释器没有监测,也不会主动采取措施处理死锁情况,因此在进行多线程编程时应该采取措施避免死锁情况出现。
四种常见的解决死锁问题的方法:
- 避免多次加锁。应尽量避免同一线程中对多个Lock进行锁定。
- 按序加锁。如果多个线程需要对多个Lock进行锁定,应该保证他们以相同的顺序请求加锁。
- 定时锁。在调用acquire()方法加锁时指定timeout参数,该参数指定timaout秒后会自动释放对Lock的锁定,这样就可以解决死锁了。
- 死锁检测。死锁检测是一种依靠算法机制实现的死锁预防机制。主要针对那些不可能实现按序加锁,也不可能实现定时锁的场景。
二、怎么减少线程安全带来的负面影响?
多线程的优势在于并发性,即可以同时运行多个任务。但是当程序中需要访问共享资源时,就可能会因为数据同步问题而发生错误,这是由于系统的线程调度具有一定的随机性造成。
不可变类总是线程安全的,因为的它的对象状态是不可改变的,但是对象状态可变的类需要额外的方法保证其线程安全。通常线程安全性的保障是通过互斥锁机制实现的,通过互斥锁可以很方便的实现线程安全的类,这里不做过多介绍。
可变类的线程安全性保障是以降低程序的运行效率为代价的,为了减少线程安全所带来的负面影响,程序设计可采用两种策略:
- 不要对线程安全类的所有方法进行同步控制,只对那些会该改变竞争资源(共享资源)的方法进行同步控制;
- 如果可变类存在多种运行环境,单线程环境和多线程环境,可为可变类实现多个版本,线程不安全版本和线程安全版本,在单线程环境下运行线程不安全版本,在多线程环境下运行线程安全版本。