import java.util.concurrent.atomic.AtomicBoolean;public class SpinLock { private AtomicBoolean locked = new AtomicBoolean(false); public void lock() { while (!locked.compareAndSet(false, true)) { // 自旋等待 } } public void unlock() { locked.set(false); }}改进这个工具类
时间: 2024-04-07 10:29:28 浏览: 49
java同步之如何写一个锁Lock
这个工具类可以进行以下改进:
1. 添加可重入锁的支持:可以为每个线程维护一个计数器,记录该线程重复获取锁的次数,然后在解锁时递减计数器。只有当计数器为0时,才真正释放锁。
2. 添加公平锁的支持:可以为等待锁的线程维护一个队列,按照请求锁的先后顺序进行排队。每次释放锁时,从队列中取出下一个线程唤醒。
3. 使用ThreadLocal优化:可以将AtomicBoolean对象封装到ThreadLocal中,每个线程只访问自己的AtomicBoolean对象,避免线程之间的竞争。
4. 改用LockSupport:可以使用LockSupport.park()/unpark()方法实现自旋等待,避免CPU空转。同时,可以在等待时设置一个超时时间,避免线程一直等待而无法释放锁。
这些改进可以根据具体场景进行选择和组合,以适应不同的需求。
阅读全文