Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java自己的SeqLock实现,避免spinlock会更好吗?_Java_Android_Performance_Concurrency_Readwritelock - Fatal编程技术网

java自己的SeqLock实现,避免spinlock会更好吗?

java自己的SeqLock实现,避免spinlock会更好吗?,java,android,performance,concurrency,readwritelock,Java,Android,Performance,Concurrency,Readwritelock,我创建了自己的简单、紧凑的ReadWriteLock实现。第一种方法在尝试获取读锁时使用自旋锁。如果设置了锁位,则第二个会通过在旋转之前瞬时获取写锁来避免旋转锁。这样,它将停止执行,直到释放写锁。现在我的问题是,哪一个更高效、更优化,以供通用?(多核和非多核机器) 编辑:它将用于我的Android应用程序。因此,在提供所需的ReadWriteLock实现的同时,我必须保持它的紧凑性。ReentrantReadWriteLock对我的应用程序来说太重了。还有,有人能提出更好的方法吗 编辑:实施细节

我创建了自己的简单、紧凑的ReadWriteLock实现。第一种方法在尝试获取读锁时使用自旋锁。如果设置了锁位,则第二个会通过在旋转之前瞬时获取写锁来避免旋转锁。这样,它将停止执行,直到释放写锁。现在我的问题是,哪一个更高效、更优化,以供通用?(多核和非多核机器)

编辑:它将用于我的Android应用程序。因此,在提供所需的ReadWriteLock实现的同时,我必须保持它的紧凑性。ReentrantReadWriteLock对我的应用程序来说太重了。还有,有人能提出更好的方法吗

编辑:实施细节取自

第一项实施如下:
import java.util.concurrent.AtomicLong;
导入java.util.concurrent.locks.ReentrantLock;
公共类自旋锁{
私有AtomicLong状态=新建AtomicLong();
private ReentrantLock writeLock=new ReentrantLock();
公共长读锁(){
长电流;
做
当前=status.get();
而((当前&1)!=0);
回流;
}
公共布尔tryReadUnlock(很久以前){
返回状态。get()==previous;
}
公共无效writeLock(){
writeLock.lock();
status.incrementAndGet();
}
公共无效writeUnlock(){
status.incrementAndGet();
writeLock.unlock();
}
public void writeLockInterruptibly()引发InterruptedException{
writeLock.lockInterruptibly();//如果我们被打断,不要在下面继续!
//仅在成功的不间断锁定时递增
status.incrementAndGet();
}
}

第二项实施如下:
import java.util.concurrent.AtomicLong;
导入java.util.concurrent.locks.ReentrantLock;
公共类半序列锁{
私有AtomicLong状态=新建AtomicLong();
private ReentrantLock writeLock=new ReentrantLock();
公共长读锁(){
对于(;;){
long current=status.get();
如果((当前&1)==0)
回流;
writeLock.lock();//通过在获取锁之前停止来避免旋转锁。
writeLock.unlock();
}
}
…//与第一个相同的代码
}

预期用途为: 读卡器线程:

(;;)的
{
最终长状态=seqLock.readLock();
//…一些读取操作。。。
//…一些读取操作。。。
如果(seqLock.tryReadUnlock(状态))中断;
}
编写器线程:

seqLock.writeLock();
试一试{
//…一些写入操作。。。
//…一些写入操作。。。
}最后{
seqLock.writeUnlock();
}
有什么更正吗?哪一个更好?你确定吗

  • 你需要它,而且
  • 您可以获得比现有实现更好的性能吗
这样的东西很容易出错,比通常的程序要多得多

因此,请尝试使用现有的锁


您的锁中至少有一个错误:
可写可中断
必须使用
最后

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

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

你确定吗

  • 你需要它,而且
  • 您可以获得比现有实现更好的性能吗
这样的东西很容易出错,比通常的程序要多得多

因此,请尝试使用现有的锁


您的锁中至少有一个错误:
可写可中断
必须使用
最后

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


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

“我创建了我自己的。*锁实现(Java)”
*抖动*
“我创建了我自己的。*锁实现(Java)”
*抖动*
可中断写入
必须使用
最终
”,这样做将允许状态号得到更新,如果锁被中断,则状态号不应增加。奇数锁定写锁。因此,代码工作正常,不需要任何
最终
块。'再一次:首先尝试一些现有的锁…',我做了很多。我一直在做一些性能测试。后来,我发现他们正在放慢我的程序。大多数都有一个缺点,即对于ReadWriteLock,java说,“底层实现很复杂”,即运行测试时ReentrantLocks运行得更快。“
writeLockInterruptibly
必须使用
finally
”,如果锁被中断,这样做将允许更新状态号,那么状态号不应该增加。奇数锁定写锁。因此,代码工作正常,不需要任何
最终
块。'再一次:首先尝试一些现有的锁…',我做了很多。我一直在做一些性能测试。后来,我发现他们正在放慢我的程序。java说,它们中的大多数都有一个缺点,即对于ReadWriteLock,“底层实现很复杂”,即运行测试时ReentrantLocks运行得更快。