Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-两个线程进入相同的条件并通过_Java_Multithreading_Synchronization - Fatal编程技术网

Java-两个线程进入相同的条件并通过

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.

我正在处理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.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
。这使得代码更加统一,因为不需要检查根是否存在

它的复杂功能不支持更多的同步而不是更少的同步吗?谢谢你的评论,我按照你的建议去掉了空检查,在这个阶段一切都很好,再次感谢。