根据我的理解,如果我使用了一个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();
}
}
答案 0 :(得分:2)
您正在创建两个单独的Test
实例,而您的incrementCount
方法是实例方法,尽管它会增加 static 变量
您的每个主题都在Test
的不同实例上运行,因此他们不会互相阻止,并且您会遇到正常的竞争条件。
如果你使incrementCount
成为静态方法,那么两个线程都将尝试获取Test.class
的监视器,并且它应该在这些条件下工作。 (虽然不能保证main
线程会读取最近写的count
的值......)
或者,创建 Test
的一个实例,并将其传递给两个Thread
构造函数,此时他们都会尝试获取监视器Test
的同一个实例。关键的一点是,如果两个线程正在获取不同的监视器,他们都可以在不等待另一个的情况下完成它...