Java多线程编程:原理、方法与实践
1. 死锁问题及解决思路
在多线程系统中,死锁是一个复杂且常见的问题。例如,在资源获取上,我们可以通过对共享资源的获取进行排序来避免死锁。假设有 chopStick[0]< chopStick[1]< chopStick[2]< chopStick[3]< chopStick[4]
这样的顺序,每个线程总是先尝试获取编号较小的筷子,如哲学家4会先尝试获取 chopstick[0]
再获取 chopstick[4]
,从而打破循环等待的死锁隐患。
在分布式系统中,死锁也时有发生。如一个用户请求在 Students
数据库表上获取锁,然后要更新 Classes
表中的行;同时另一个用户请求在 Classes
表上获取锁,接着要更新 Students
表中的信息。如果这两个请求以重叠的方式获取锁,就会导致死锁。
2. 线程状态
Java中的多线程系统有一个系统调度器,它是基于优先级的抢占式调度器,会选择执行优先级最高且希望运行的线程。每个线程都有一个优先级,默认值为5,范围是0到10,线程会从其父线程继承优先级。虽然高优先级线程会更频繁地被调度,但在大多数应用中,所有线程使用默认优先级就足够了。
线程会经历以下四种不同的状态:
- 创建(Created) :线程对象已创建,但 start()
方法尚