Java-两个线程进入相同的条件并通过
我正在处理BTree,我想同步它,但问题是: 我不想同步整个方法,因为它有一个复杂的功能 我的问题是:如何防止前两个或三个线程传递第一个条件,即Java-两个线程进入相同的条件并通过,java,multithreading,synchronization,Java,Multithreading,Synchronization,我正在处理BTree,我想同步它,但问题是: 我不想同步整个方法,因为它有一个复杂的功能 我的问题是:如何防止前两个或三个线程传递第一个条件,即root==null public void add(TrackingDevice device) { // Tree is Empty, then add a new elemet to root if (root == null ) { root = new BTreeNode(true); root.
root==null
public void add(TrackingDevice device) {
// Tree is Empty, then add a new elemet to root
if (root == null ) {
root = new BTreeNode(true);
root.keys[0] = device;
root.n++;
} else {
/*
* The root is Full
*/
if (root.n == 2 * t - 1) {
splitRoot();
root.insert(device);
height++;
} else {
root.insert(device);
}
}
}
我只是建议:实现一个类似信号量的结构。定义一个同步计数器,线程每次进入该计数器时都将递减(注意:此操作必须是互斥的),并防止线程在计数器==0时进入节。我将使用带有compareAndSet方法的
然后,多个线程可能会传递条件root.get()==null并创建根节点。但是只有最快的线程才会通过compareAndSet写入值。您可以使用
原子引用
作为对根节点的引用,并使用compareAndSet(null,new BTreeNode(true))
来保护if
块的入口。如果非常频繁地调用add
方法,那么这种方法最终会创建许多短期b重新编码
实例。如果这是一个问题,您可以先“手动”检查AtomicReference
是否包含null
,并且仅在这样的情况下调用compareAndSet
但是,我会完全去掉
null
检查,并在初始设置根节点时使用n=0
。这使得代码更加统一,因为不需要检查根是否存在 它的复杂功能不支持更多的同步而不是更少的同步吗?谢谢你的评论,我按照你的建议去掉了空检查,在这个阶段一切都很好,再次感谢。