自己的SeqLock实现,避免旋转锁会更好



我创建了自己的简单紧凑的ReadWriteLock实现。第一个在尝试获取读锁定时使用旋转锁。如果设置了锁定位,则第二个位通过在旋转之前暂时获取写锁定来避免旋转锁。这样,它会停止执行,直到释放写锁定。现在我的问题是哪个更有效,并且针对常用进行了优化?(多核和非多核计算机)

编辑:它将用于我的Android应用程序。因此,我必须保持紧凑,同时提供我需要的ReadWriteLock实现。ReentrantReadWriteLock对我的应用程序来说很重。另外,任何人都可以提出更好的方法吗?

编辑:实施详细信息取自此链接。

第一个实现如下:

import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.locks.ReentrantLock;
public class SpinSeqLock {
    private AtomicLong status = new AtomicLong();
    private ReentrantLock writeLock = new ReentrantLock();
    public long readLock() {
        long current;
        do
            current = status.get();
        while ((current & 1) != 0);
        return current;
    }
    public boolean tryReadUnlock(long previous) {
        return status.get() == previous;
    }
    public void writeLock() {
        writeLock.lock();
        status.incrementAndGet();
    }
    public void writeUnlock() {
        status.incrementAndGet();
        writeLock.unlock();
    }
    public void writeLockInterruptibly() throws InterruptedException {
        writeLock.lockInterruptibly(); // If we get interrupted, do not proceed below!
        // Increment only on successful uninterrupted lock
        status.incrementAndGet();
    }
}

第二个实现如下:

import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.locks.ReentrantLock;
public class SemiSeqLock {
    private AtomicLong status = new AtomicLong();
    private ReentrantLock writeLock = new ReentrantLock();
    public long readLock() {
        for (;;) {
            long current = status.get();
            if ((current & 1) == 0)
                return current;
            writeLock.lock(); // Avoids spin lock by halting until lock-acquisition.
            writeLock.unlock();
        }
    }
    ... // Same code as the first one
}

预期用法为:

读者线程:

for (;;) {
    final long status = seqLock.readLock();
    // ... some read operation ...
    // ... some read operation ...
    if (seqLock.tryReadUnlock(status)) break;
}

编写器线程:

seqLock.writeLock();
try {
    // ... some write operation ...
    // ... some write operation ...
} finally {
    seqLock.writeUnlock();
}

有什么更正吗?哪一个更好?

你确定

  • 你需要它和
  • 你能得到比现有实现更好的吗?

这样的事情非常容易出错,比通常的程序要多得多。

所以真的真的尝试使用现有的锁。

您的锁中至少有一个错误:writeLockInterruptibly必须使用 finally

性能方面,在你长时间睡觉之前旋转几次可能是明智的 writeLock .总的来说,我不确定它会起作用...但它看起来很有趣。

再一次:首先尝试一些由在这方面非常聪明和经验丰富的人编写的现有锁。

相关内容

  • 没有找到相关文章

最新更新