Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.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 开锁时间太长_Java_Locking - Fatal编程技术网

Java 开锁时间太长

Java 开锁时间太长,java,locking,Java,Locking,我有一个受ReadWriteLock保护的对象 final ReadWriteLock pendingRequestsLock = new ReentrantReadWriteLock(); final Lock pendingRequestsReadLock=pendingRequestsLock.readLock(); final Lock pendingRequestsWriteLock=pendingRequestsLock.writeLock(); 问题是,有时(似乎是随机和罕见的)

我有一个受
ReadWriteLock
保护的对象

final ReadWriteLock pendingRequestsLock = new ReentrantReadWriteLock();
final Lock pendingRequestsReadLock=pendingRequestsLock.readLock();
final Lock pendingRequestsWriteLock=pendingRequestsLock.writeLock();
问题是,有时(似乎是随机和罕见的)解锁写锁的时间太长(在Intel i7 2.6GHz CPU上为4-10ms)。我这样测量解锁时间:

Long time2=System.currentTimeMillis();
pendingRequestsWriteLock.unlock();
Long unlockTime=System.currentTimeMillis()-time2;
if(unlockTime>1)System.out.println("Unlock time: "+unlockTime);
使用写锁的线程将定期启动(每100ms一次)

问题
解锁时间长的原因是什么?如何避免它?

通过避免锁定来避免它。它们非常昂贵,尤其是读写锁。几乎可以肯定还有其他方法可以实现它,如果您希望得到避免锁的建议,可以发布使用锁的代码。此外,我不理解“使用写锁的线程正在定期启动(每100毫秒一次)。”最好是发布整个基准测试,因为这些测试经常会出错。避免锁不是一个选项,因为我们谈论的是多线程应用程序。有3个线程使用同一对象。其中2个大部分只是读取它,这就是我使用读写锁的原因。第三个线程是计划作业,每100ms运行一次。这个函数在任务开始时获取写锁,并在任务结束时释放。我明白,获得锁可能需要很长时间。但是为什么它需要8ms才能发布呢?我没有基准测试。我只是测量执行“pendingRequestsWriteLock.unlock();”需要多少时间呼叫,有时需要4-8毫秒。请参阅问题中的第二个代码块。“避免锁定不是一个选项”,我已经编写了几十个多线程应用程序。我从来没有使用过
ReentrantReadWriteLock
。还有其他更适合您的应用程序的选项。