Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.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_Concurrency - Fatal编程技术网

Java 我不知道';在这种情况下,我们不知道线程是如何工作的

Java 我不知道';在这种情况下,我们不知道线程是如何工作的,java,multithreading,concurrency,Java,Multithreading,Concurrency,下面的代码显示了线程中的无竞争条件是如何工作的,但我不知道有同步和无同步的区别。我原以为静态变量计数器将被添加到20000,但结果表明,没有同步计数器将小于20000。你能解释一下在这种情况下线程是如何工作的吗?另外,在Java中,线程实际上不是“并发”运行,而是轮流运行一段时间 public class NoRaceCondition implements Runnable { private static int counter = 0; private static Obj

下面的代码显示了线程中的无竞争条件是如何工作的,但我不知道有同步和无同步的区别。我原以为静态变量计数器将被添加到20000,但结果表明,没有同步计数器将小于20000。你能解释一下在这种情况下线程是如何工作的吗?另外,在Java中,线程实际上不是“并发”运行,而是轮流运行一段时间

public class NoRaceCondition implements Runnable {
    private static int counter = 0;
    private static Object gateKeeper = new Object();

    public static void main(String[] args) {
        Thread t1 = new Thread(new NoRaceCondition());
        Thread t2 = new Thread(new NoRaceCondition());
        t1.start();
        t2.start();
        try {
            t1.join();
            t2.join();
        } catch (InterruptedException e) { e.printStackTrace(); }
        System.out.printf("counter = %d\n", counter);
    }

    public void run() {
        synchronized (gateKeeper) {
            for (int i = 0; i < 10000; i++) {
                {
                    counter++;
                }
            }
        }
    }
}
public类NoRaceCondition实现可运行{
专用静态整数计数器=0;
私有静态对象网关守卫=新对象();
公共静态void main(字符串[]args){
线程t1=新线程(new noracecodition());
线程t2=新线程(新的NoRaceCondition());
t1.start();
t2.start();
试一试{
t1.join();
t2.连接();
}catch(InterruptedException e){e.printStackTrace();}
System.out.printf(“计数器=%d\n”,计数器);
}
公开募捐{
已同步(网守){
对于(int i=0;i<10000;i++){
{
计数器++;
}
}
}
}
}

您可以将
count++
看作三个独立的步骤

  • 读取
    count的值
  • 增值
  • 用新的递增值覆盖
    count
  • 当多个线程同时执行上述步骤时,可能会发生争用情况。竞争条件的一个例子是

    count=1

    设两个名为
    A
    B

    线程A读取
    count
    的值并获取
    1

    线程B读取
    count
    的值并获取
    1

    线程A增加其值并得到2

    线程B增加其值并得到2

    线程A将值写入
    count

    计数现在是2

    线程B将值写入
    count

    count
    现在再次变为2,而在2次递增后,预计它将变为3


    谢谢你的解释!