【发布时间】:2016-02-18 12:57:56
【问题描述】:
好的,所以我意识到所有线程共享堆,其中包含已为 java 程序分配的所有对象。这意味着如果多个线程试图分配一个新对象,那么它们可能会相互混淆并导致分段错误。在阅读了一些其他线程之后,我仍然不明白是否有一种无锁、安全的方式来在线程内构造对象。我正在尝试在 Java 中为一个学校项目实现一个无锁哈希图,并且需要确定我所做的构造函数调用是否是线程安全的。如果没有,是否有某种解决方法或内存管理技术可以让事情正常进行?
这是我的内部类的样子
public class dataNode<T> extends node<T>{
int hash;
T data;
public dataNode(int _hash, T _value){
this.isArrayNode = false;
this.hash = _hash;
this.data = _value;
}
}
还有我的无锁哈希图的另一个内部类:
import java.util.concurrent.atomic.*;
public class arrayNode<T> extends node<T>{
//this is an array where elements consist of datanodes and arraynodes
AtomicStampedReference<node<T>> [] array;
public arrayNode(int size){
this.isArrayNode = true;
array = new AtomicStampedReference[size];
for (int i = 0; i < size; i++){
array[i] = new AtomicStampedReference<node<T>>(null, concurMap.UNINITIALIZED);
}
}
}
【问题讨论】:
-
this means if multiple threads try to allocate a new object, then they might mess each other up and cause a segmentation fault- 我会说那是JVM的错。仅在多个 Java 线程中创建新对象(即在 JVM 内部 - 其他人无论如何都无法访问该堆)不应导致段错误。如果你得到一个错误,要么是 JVM 本身,要么是一些与堆混淆的本机库。 -
顺便说一句,如果你想遵守 Java 编码约定,你的类名应该以大写字母开头,即
DataNode、Node、ArrayNode。
标签: java multithreading memory-management heap-memory