无法理解输出

时间:2016-06-10 15:33:54

标签: java multithreading

根据我的理解,如果我使用了一个synchronized关键字,那么只有一个线程可以进入,一旦它离开,那么只有其他线程。但是为什么我的下面的代码有时打印第一个2 第二个

package com.vikash.GeeksForGeeks;

public class Test implements Runnable{

    private  static  int count;

    public  synchronized  void  incrementCount()
    {
        count++;
        System.out.println(Thread.currentThread().getName()+" "+count);
    }
    public static void main(String[] args) throws InterruptedException {

        Thread t1=new Thread(new Test());
        Thread t2=new Thread(new Test());
        t1.start();t1.setName("First");
        t2.start();t2.setName("Second");
        t1.join();
        t2.join();
        System.out.println("Count Value="+count);

    }
    @Override
    public void run() {
        incrementCount();
    }
}

1 个答案:

答案 0 :(得分:2)

您正在创建两个单独的Test实例,而您的incrementCount方法是实例方法,尽管它会增加 static 变量

您的每个主题都在Test的不同实例上运行,因此他们不会互相阻止,并且您会遇到正常的竞争条件。

如果你使incrementCount成为静态方法,那么两个线程都将尝试获取Test.class的监视器,并且它应该在这些条件下工作。 (虽然不能保证main线程会读取最近写的count的值......)

或者,创建 Test的一个实例,并将其传递给两个Thread构造函数,此时他们都会尝试获取监视器Test的同一个实例。关键的一点是,如果两个线程正在获取不同的监视器,他们都可以在不等待另一个的情况下完成它...