Java 使用多个线程递增和递减单个共享变量

Java 使用多个线程递增和递减单个共享变量,java,multithreading,concurrency,bluej,Java,Multithreading,Concurrency,Bluej,当使用单个共享变量递增和递减多个线程时,如何确保线程以同步方式计数且不跳过任何值 我创建了一个单独的类,其中我有3个不同的方法,一个用于递增,另一个用于递减,最后一个用于返回值。它们也都是同步的 结果显示了一个示例: 这是线程4的迭代:-108次/500次 这是线程5迭代:291/500 这是线程4迭代:-109/500 这是线程4迭代:-110/500 正如您所看到的,线程正在递减,但随后跳到291,这不应该发生,因为我使用的是共享变量 *******************编辑*******

当使用单个共享变量递增和递减多个线程时,如何确保线程以同步方式计数且不跳过任何值

我创建了一个单独的类,其中我有3个不同的方法,一个用于递增,另一个用于递减,最后一个用于返回值。它们也都是同步的

结果显示了一个示例:

这是线程4的迭代:-108次/500次 这是线程5迭代:291/500 这是线程4迭代:-109/500 这是线程4迭代:-110/500 正如您所看到的,线程正在递减,但随后跳到291,这不应该发生,因为我使用的是共享变量

*******************编辑********

代码:-共享变量类

public class shareVar extends Thread
{
    private static int sharedVariable = 0;


    public synchronized static void increment(){
        sharedVariable++;
    }

    public synchronized static void decrement(){
        sharedVariable--;
    }

    public  static int value(){
        return sharedVariable;
    }
}
---递增类

sVar incrementVal = new sVar();

public synchronized void display(){

    for(int countVal = 0; countVal<=max; countVal++ ){
            incrementVal.increment();
            System.out.println("This is " + threadName + " iteration: " + incrementVal.value() + " of " + max);
            //this.yield();
    }
    System.out.println("*THIS " + threadName + " IS FINISH " 
                                    + "INCREMENTING *");

}

public void run(){

    display();
}
考虑使用:

或使用同步方法:

public class Foo
{
    private volatile int counter;

    public synchronized void increment()
    {
        counter++;
    }

    public synchronized void decrement()
    {
        counter--;
    }

    public int getValue()
    {
        return counter;
    }
}
考虑使用:

或使用同步方法:

public class Foo
{
    private volatile int counter;

    public synchronized void increment()
    {
        counter++;
    }

    public synchronized void decrement()
    {
        counter--;
    }

    public int getValue()
    {
        return counter;
    }
}

不确定我是否正确理解了您的问题,但您的输出看起来是这样的,因为另一个线程线程4在线程5输出值之前开始处理该值

每个迭代简化列表中都有许多操作,实际上不止这些:

增量/减量 获取当前值 创建输出字符串 输出输出字符串 而另一个线程可能会在这些操作之间获得一个回合。所以可能是线程5执行它所执行的操作,然后其他线程得到循环,并且只有在一段时间后线程5才会输出结果


如果希望按顺序输出新值,则需要在同步块内输出当前值,即递增/递减方法

不确定我是否正确理解了您的问题,但您的输出看起来是这样的,这只是因为另一个线程线程4在线程5输出值之前开始处理该值

每个迭代简化列表中都有许多操作,实际上不止这些:

增量/减量 获取当前值 创建输出字符串 输出输出字符串 而另一个线程可能会在这些操作之间获得一个回合。所以可能是线程5执行它所执行的操作,然后其他线程得到循环,并且只有在一段时间后线程5才会输出结果



如果希望按顺序输出新值,则需要在同步块内输出当前值,即递增/递减方法

如果没有代码发布,则无法判断。如果没有代码发布,则无法判断。如果没有代码发布,则无法判断。如果没有代码发布,则无法判断。如果没有代码发布,则无法判断。如果没有代码发布,则无法判断。如果没有代码发布,则无法判断。如果没有代码发布,则无法判断。如果没有代码发布,则无法判断。如果没有代码发布,则无法判断。如果没有代码发布,则无法判断。如果没有代码发布,则无法判断。如果没有代码发布,则无法判断。如果没有代码发布,则伯爵*****这是Thread_2迭代:-9 of 500这是Thread_2迭代:-8 of 500这是Thread_1迭代:-135 of 500这是Thread_1迭代:-7 of 500这是Thread_1迭代:-6 of 500是否可以在一个方法中同时运行增量和decerement,而不是使用两个不同的方法?我已经这样做了,但我仍然没有得到答案完全同步递增和递减计数*****这是Thread_2迭代-9 of 500这是Thread_2迭代-8 of 500这是Thread_1迭代-135 of 500这是Thread_1迭代-7 of 500这是Thread_1迭代-6 of 500这是Thread_2迭代-6 of 500有可能在一种方法中同时运行增量和decerement而不是使用两种不同的方法吗?我想我明白你的意思,是否可以看到一个示例?是否可以在一个方法中同时运行递增和递减,而不是使用两个不同的方法?只需将System.out.println放在递增或递减的内部。如果要对两个操作使用一个方法,请使用方法参数来指示它是哪一个操作。像operateboolean增量。谢谢。。我试过了,但是我仍然得到了一些部分,在线程中仍然没有遵循1或2个线程可能具有随机值的顺序。您是使用了一种方法还是两种方法?我刚刚意识到,您必须仅使用一个来实现订购。这应该会有帮助。我想我理解你的意思,可以看一个例子吗?可以在一个方法中同时运行递增和递减,而不是使用两个不同的方法吗?只需将System.out.println放在递增或递减的内部。如果要对两个操作使用一个方法,请使用方法参数来指示它是哪一个操作。像operateboolean增量。谢谢。。我试过了,但是我仍然得到了一些部分,在线程中仍然没有遵循1或2个线程可能具有随机值的顺序。您是使用了一种方法还是两种方法?我刚意识到你必须用一个 实现订购。这应该会有帮助。