我正在读Brian Goetz的一本书"实践中的Java并发".第3.5和3.5.1段包含我无法理解的陈述.
请考虑以下代码:
public class Holder {
private int value;
public Holder(int value) {
this.value = value;
}
public void assertValue() {
if (value != value) throw new AssertionError("Magic");
}
}
class HolderContainer {
// Unsafe publication
public Holder holder;
public void init() {
holder = new Holder(42);
}
}
Run Code Online (Sandbox Code Playgroud)
作者说:
因此,根据文本,有些不幸的时机可能值= 0; 在下一刻,值= 42.
我同意第1点,Object构造函数首先使用默认值填充字段.但我不明白第2和第3点.
让我们更新作者代码并考虑以下示例:
public class Holder {
int value;
public Holder(int value) {
//Sleep to prevent constructor to finish too early
try { …Run Code Online (Sandbox Code Playgroud) 我正在尝试实现双向图搜索.据我所知,我应该以某种方式合并两个广度优先搜索,一个从起始(或根)节点开始,另一个从目标(或结束)节点开始.当广度优先搜索在同一顶点"相遇"时,双向搜索终止.
您能否为我提供代码示例(如果可能,使用Java)或链接代码以进行双向图搜索?
java search artificial-intelligence graph bidirectional-search
例如,我们有一个字符串:“abc”。是否可以创建一个哈希函数(复杂度为 O(N),其中 N 是字符串长度),它将执行以下操作:对于字符串“abc”的所有排列,它将返回相同的结果。
例如:
hash("abc") returns SC0wA //just an example value, not a real hash key
hash("bac") returns SC0wA
...
hash("cba") returns SC0wA
Run Code Online (Sandbox Code Playgroud)
但对于“bba”,它将是:
hash("bba") return GD1z
hash("bab") return GD1z
Run Code Online (Sandbox Code Playgroud)
更新:
哈希函数不应该对整个字母表有任何冲突
我正在深入研究 x86 ASM 中的左移和右移操作,例如shl eax, cl
来自 IA-32 英特尔架构软件开发人员\xe2\x80\x99s 手册 3
\n\n\n\n\n所有 IA-32\n 处理器(从 Intel 286 处理器开始)都会将移位计数屏蔽为 5 位,从而导致最大计数为 31。此屏蔽在所有操作模式\n 中完成(包括虚拟 8086模式)以减少指令的最大执行时间。
\n
我试图理解这个逻辑背后的原因。也许它以这种方式工作是因为在硬件级别上很难使用 1 个周期实现寄存器中所有 32(或 64)位的移位?
\n\n任何详细的解释都会有很大帮助!
\n