我有一个关于Java线程活锁的有趣问题。它是这样的。
有四个全局锁 - L1、L2、L3、L4
有四个线程 - T1、T2、T3、T4
T1需要锁L1、L2和L3,T2需要锁L2,T3需要锁L3和L4,T4需要锁L1和L2。
因此,问题的模式是 - 任何一个线程都可以以任意顺序运行并获取锁。如果任何一个线程检测到它需要的锁不可用,它会释放它之前获取的所有其他锁,并在重新尝试之前等待一段固定时间。这个循环重复,导致了一个活锁状态。
因此,为了解决这个问题,我有两个解决方案:
1)让每个线程在重新尝试之前等待一段随机的时间。
2)改变锁的获取顺序,例如按照L1、L2、L3、L4的顺序获取锁,这样就消除了死锁。
有四个全局锁 - L1、L2、L3、L4
有四个线程 - T1、T2、T3、T4
T1需要锁L1、L2和L3,T2需要锁L2,T3需要锁L3和L4,T4需要锁L1和L2。
因此,问题的模式是 - 任何一个线程都可以以任意顺序运行并获取锁。如果任何一个线程检测到它需要的锁不可用,它会释放它之前获取的所有其他锁,并在重新尝试之前等待一段固定时间。这个循环重复,导致了一个活锁状态。
因此,为了解决这个问题,我有两个解决方案:
1)让每个线程在重新尝试之前等待一段随机的时间。
2)改变锁的获取顺序,例如按照L1、L2、L3、L4的顺序获取锁,这样就消除了死锁。
OR,
2) 让每个线程按特定顺序获取所有锁(即使线程不需要所有锁)
我并不认为这是我唯一的两个选择。请给予建议。