Tag: order

java中的同步重新排序

众所周知,JVM不应该将带有同步块的语句重新排序到同步块之外。 考虑到这一点,是否允许JVM重新排序赋值y = 7以便在以下代码段中的synchronized块之后发生? x = 5; y = 7; synchronized (this) { x = 6; } 我们知道在同步块之前的变量赋值可以重新排序以在块内发生。 所以以下内容应该是初始代码的有效重新排序: x = 5; synchronized (this) { x = 6; y = 7; } 有人可能会争辩说,因为这是一个有效的排序,所以在synchronized块之后不会发生y赋值,因为它违反了同步块内的代码不能在块之后重新排序并推断y 发生的规则 – 在结束之前同步块的。 另一方面,可能所有的排序都不等同,重要的是哪个排序是实际排序。 具体来说,如果y赋值最初是在同步块内完成的,则在块之后不会发生,否则就可能发生。 总结一下,接下来是订购第一个片段的有效排序吗? x = 5; synchronized (this) { x = 6; } y = 7;

是什么导致java.util.HashSet和HashMap.keySet()类的iterator()稍微不可预测的排序?

六年前,我烧了几天试图追捕我完全确定的框架随机响应的地方。 在精心追逐整个框架确保它全部使用相同的Random实例后,我继续追逐单步执行代码。 这是高度重复的迭代自调用代码。 更糟糕的是,该死的效果只会在完成大量迭代后出现。 在+6小时之后,当我在javadoc中为HashSet.iterator()发现一行时,我终于处于智慧状态,表明它不能保证返回元素的顺序。 然后,我浏览了整个代码库,并用LinkedHashSet替换了所有HashSet实例。 而且,我的框架正好向确定性生活迈进! 哎呀! 我现在刚刚经历过同样的FREAKIN影响(至少这次只有3个小时)。 无论出于何种原因,我都错过了HashMap恰好为其keySet()提供相同方式的小细节。 这是关于这个主题的SO线程,虽然讨论从来没有完全回答我的问题: HashSet的迭代顺序 所以,我很好奇为什么会这样。 鉴于我两次都有一个巨大的单线程java应用程序在完全相同的实例化/插入空间中使用完全相同的JVM参数(来自同一批处理文件的多次运行)在同一台计算机上运行,​​几乎没有其他任何运行,这可能会扰乱JVM使得HashSet和HashMap在经过大量迭代之后会出现不可预测的行为(并不是因为javadoc说不依赖于顺序而不一致)? 从源代码(java.util中的这些类的实现)或您对JVM的了解(可能是某些GC影响内部java类在分配内部存储空间时获得非零内存的位置)的任何想法?

按相反顺序排序列表

我有直接的List list1。 List list = Ordering.natural().sortedCopy(asu2); 如何改变秩序。 我不知道如何从extends类重写方法,请用示例写或清楚说。 谢谢。