我正在实现请求实例的FIFO队列(预先分配的请求对象以获得速度),并在add方法上使用"synchronized"关键字开始.该方法非常短(检查固定大小缓冲区中的空间,然后向数组添加值).使用visualVM看起来线程比我更喜欢阻塞("监视器"准确).因此,我将代码转换为使用AtomicInteger值,例如跟踪当前大小,然后在while循环中使用compareAndSet()(因为AtomicInteger在内部为incrementAndGet()等方法执行).代码现在看起来要长一点.
我想知道的是使用synchronized和更短代码的性能开销与没有synchronized关键字的更长代码相比(因此永远不应该阻塞锁).
这是使用synchronized关键字的旧get方法:
public synchronized Request get()
{
if (head == tail)
{
return null;
}
Request r = requests[head];
head = (head + 1) % requests.length;
return r;
}
Run Code Online (Sandbox Code Playgroud)
这是没有synchronized关键字的新get方法:
public Request get()
{
while (true)
{
int current = size.get();
if (current <= 0)
{
return null;
}
if (size.compareAndSet(current, current - 1))
{
break;
}
}
while (true)
{
int current = head.get();
int nextHead = (current + 1) % requests.length;
if (head.compareAndSet(current, nextHead))
{
return requests[current]; …Run Code Online (Sandbox Code Playgroud) Erlang容错(据我所知)包括使用管理程序进程来监视工作进程,因此如果工作者死亡,主管可以启动一个新的.
Erlang如何进行此监控,尤其是在分布式方案中?怎么能确定这个过程真的死了?它会做心跳吗?内置于运行时环境中的是什么?如果拔下网络电缆怎么办?如果无法与其通信,是否会假设其他进程已经死亡?等等
我在考虑如何在JVM(例如Java或Scala)中实现Erlang声称的相同容错等.但我不确定是否需要内置于JVM中的支持以及Erlang.虽然作为一个比较点,我还没有看到Erlang如何做到的定义.
我想从某个地方获取一个字节数组(Array [Byte])(从文件中读取,从socket中读取等),然后提供一种有效的方法来从中提取位(例如,提供一个提取32位整数的函数)来自阵列中的偏移量N).然后我想包装字节数组(隐藏它),提供从数组中拉出位的函数(可能使用lazy val为每个位拉出).
我想有一个包装类,它在构造函数中采用不可变的字节数组类型来证明数组内容永远不会被修改.IndexedSeq [Byte]似乎相关,但我无法弄清楚如何从Array [Byte]转到IndexedSeq [Byte].
问题的第2部分是,如果我使用IndexedSeq [Byte],结果代码会变慢吗?我需要代码尽可能快地执行,因此如果编译器可以更好地使用它,那么就会坚持使用Array [Byte].
我可以在数组周围编写一个包装类,但这样会减慢速度 - 每次访问数组中的字节时都会有一个额外的间接级别.由于需要的阵列访问次数,性能至关重要.我需要快速代码,但希望能够很好地同时执行代码.谢谢!
PS:我是斯卡拉新手.