- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试为 Hibernate 实现我自己的序列生成器。开箱即用的方法带有同步方法,这会导致我的应用程序出现过多争用(多个线程并行地将数据插入 Oracle 数据库)。
我想尝试一下 StampedLock,但不幸的是,我的测试用例(150.000 行,16 个线程)总是在 150.000 次执行中产生 5-15 次 id 冲突。
附上我的代码,您知道我做错了什么吗?或者您可以建议更好的方法吗?谢谢。
import java.io.Serializable;
import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.locks.StampedLock;
import org.hibernate.engine.spi.SessionImplementor;
import org.hibernate.id.IntegralDataTypeHolder;
import org.hibernate.id.SequenceGenerator;
public class HighConcurrencySequenceGenerator extends SequenceGenerator
{
private StampedLock lock = new StampedLock();
private AtomicLong sequenceValue; // the current generator value
private IntegralDataTypeHolder lastSourceValue; // last value read from db
private IntegralDataTypeHolder upperLimitValue; // the value to query the db again
@Override
public Serializable generate( SessionImplementor session, Object object )
{
long stamp = this.lock.readLock();
try
{
while ( needsSequenceUpdate() )
{
long ws = this.lock.tryConvertToWriteLock( stamp );
if ( ws != 0L )
{
stamp = ws;
return fetchAndGetNextSequenceValue( session );
}
this.lock.unlockRead( stamp );
stamp = this.lock.writeLock();
}
return getNextSequenceValue();
}
finally
{
this.lock.unlock( stamp );
}
}
private long fetchAndGetNextSequenceValue( SessionImplementor session )
{
this.lastSourceValue = generateHolder( session );
long lastSourceValue = this.lastSourceValue.makeValue()
.longValue();
this.sequenceValue = new AtomicLong( lastSourceValue );
long nextVal = getNextSequenceValue();
this.upperLimitValue = this.lastSourceValue.copy()
.add( this.incrementSize );
return nextVal;
}
private long getNextSequenceValue()
{
long nextVal = this.sequenceValue.getAndIncrement();
return nextVal;
}
private boolean needsSequenceUpdate()
{
return ( this.sequenceValue == null ) || !this.upperLimitValue.gt( this.sequenceValue.get() );
}
}
最佳答案
这段代码不是线程安全的
this.sequenceValue = new AtomicLong( lastSourceValue );
在最坏的情况下,您最终会得到 N 个具有相同内容的 AtomicLong
实例值,其中 N 是正在运行的线程数。
关于java - 与StampedLock 的竞争条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52187128/
概览 在 JDK 1.8 引入 StampedLock,可以理解为对 ReentrantReadWriteLock 在某些方面的增强,在原先读写锁的基础上新增了一种叫乐观读(Opt
我正在调查基于 Java8 的 StampedLock ( javadoc here ) 锁定缓存,但我无法在网上找到令人信服的实现,尽管阅读了文章喜欢StampedLock Idioms . 在对
我们介绍了读写锁,学习完之后你应该已经知道“读写锁允许多个线程同时读共享变量,适用于读多写少的场景”。那在读多写少的场景中,还有没有更快的技术方案呢?还真有,Java 在 1.8 这个版本里,提供了一
我正在使用 StampedLock 实现缓存读取或加载方法,我想知道是否可以改编 javadoc 中的示例比这更好。 作者 Doug Lea 给出了一个“乐观读”示例和一个“将读锁升级为写锁”示例,但
http://winterbe.com/posts/2015/04/30/java8-concurrency-tutorial-synchronized-locks-examples/包含此代码: S
我一直在使用 ReadWriteLock `s 来实现/维护锁定习语。 自 JDK8 StampedLock已介绍。由于 RWLocks 以其缓慢和糟糕的性能而闻名,StampedLock 看起来像是
我正在编写以下代码。 CreateThread.java import java.util.concurrent.locks.*; class CreateThread { public s
给定来自 Oracle 文档的代码示例 https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/StampedLock
我正在编写 Java 代码,我需要在其中实现线程。我正在通过 JAVA 8 API 并开始了解 Stamped Locks。谁能告诉我为什么在多线程中使用 StampedLocks? 提前致谢。 最佳
一、写在开头 我们在上一篇写ReentrantReadWriteLock读写锁的末尾留了一个小坑,那就是读写锁因为写锁的悲观性,会导致 “写饥饿”,这样一来会大大的降低读写效率,而今天我们就来将
在 ReentrantLock 和 StampedLock 之间进行选择的用例应该是什么?例如,如果我有 10 个读者和 10 个写者,应该选择哪种锁?如果我有 20 名读者和 1 名作者,该选择哪一
我正面临关于 StampedLock 的奇怪行为.以下是主要有问题的代码行: StampedLock lock = new StampedLock(); long stamp1 = lock.read
从文档中还不清楚,如果在保持readLock的情况下尝试进行写入操作,那么读写器线程会发生什么情况。 我说的是这个时机: 阅读器线程(或某些阅读器线程)进入并获取readlock,目的是在某些多字段对
这comparison of StampedLock and other locks表明StampedLock随着竞争的加剧,是最快的。然而,这篇文章和其他各种文章都没有列出为什么它更快。它似乎使用与
最近我了解到存在StampedLock ? https://docs.oracle.com/javase/10/docs/api/java/util/concurrent/locks/StampedL
我是一名优秀的程序员,十分优秀!