Java 无法理解输出
根据我的理解,如果我使用了同步关键字,那么只有一个线程可以进入,一旦它离开,那么只有另一个线程可以进入 第二个2Java 无法理解输出,java,multithreading,Java,Multithreading,根据我的理解,如果我使用了同步关键字,那么只有一个线程可以进入,一旦它离开,那么只有另一个线程可以进入 第二个2 您正在创建两个独立的Test实例,您的incrementCount方法是一个实例方法,尽管它增加了一个静态变量 您的每个线程都在不同的Test实例上运行,因此它们不会相互阻塞,您将运行到正常的争用条件中 如果将incrementCount设置为静态方法,则两个线程都将尝试获取Test.class的监视器,并且它应该在这些条件下工作。(虽然不能保证main线程将读取count的最新写入
您正在创建两个独立的
Test
实例,您的incrementCount
方法是一个实例方法,尽管它增加了一个静态变量
您的每个线程都在不同的Test
实例上运行,因此它们不会相互阻塞,您将运行到正常的争用条件中
如果将incrementCount
设置为静态方法,则两个线程都将尝试获取Test.class
的监视器,并且它应该在这些条件下工作。(虽然不能保证main
线程将读取count
的最新写入值)
或者,创建一个
Test
实例,并将其传递给两个线程
构造函数,此时他们都将尝试获取同一个Test
实例的监视器。关键的一点是,如果两个线程正在获取不同的监视器,那么它们都可以在不等待另一个的情况下完成这项任务。您正在创建两个独立的Test
实例,并且您的incrementCount
方法是一个实例方法,尽管它增加了一个静态变量
您的每个线程都在不同的Test
实例上运行,因此它们不会相互阻塞,您将运行到正常的争用条件中
如果将incrementCount
设置为静态方法,则两个线程都将尝试获取Test.class
的监视器,并且它应该在这些条件下工作。(虽然不能保证main
线程将读取count
的最新写入值)
或者,创建一个Test
实例,并将其传递给两个线程
构造函数,此时他们都将尝试获取同一个Test
实例的监视器。关键的一点是,如果两个线程正在获取不同的监视器,那么它们都可以在不等待另一个线程的情况下完成此操作
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();
}
}