当前位置: 首页 > 知识库问答 >
问题:

Java:多线程通过同步方法同时访问变量来递减静态变量

益清野
2023-03-14
public class Person extends Thread {

    private static int count = 10;

    public void decrement() {
        synchronized(Person.class) {
            count--;
        }

    }

    public int getCount() {
        return count;
    }

    public void run(){
        while( count > 0){
            this.decrement();
            System.out.print(this.getCount() + ",");
        }
    }
}
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

        Person p1 = new Person();
        Person p2 = new Person();
        Person p3 = new Person();
        Person p4 = new Person();
        Person p5 = new Person();

        p1.start();
        p2.start();
        p3.start();
        p4.start();
        p5.start();
    }
}
8,8,7,6,5,4,3,2,1,0

8,7,5,3,1,0,6,8,4,0

共有1个答案

赏航
2023-03-14

原始代码中的内容如下:

  1. 线程1减少计数(计数->9)
  2. 线程两次递减计数(计数->8)
  3. 线程三次递减计数(计数->7)
  4. 线程四次递减计数(计数->6)
  5. 线程1输出计数(count:6)
  6. 线程两个输出计数(计数:6)
  7. 线程三个输出计数(计数:6)
  8. 线程四个输出计数(计数:6)

因为您锁定的是减量,而不是减量和输出在一起,所以它看起来是多次减量。

        this.decrement();
        System.out.print(this.getCount() + ",");
public class Person extends Thread {

    private static int count = 10;

    public int decrement() {
        synchronized(Person.class) {
            count = count - 1;
            return count;
        }

    }

    public int getCount() {
        synchronized(Person.class) {
            return count;
        }
    }

    public void run(){
        while( getCount() > 0){
            int count = this.decrement();
            System.out.println(count);
        }
    }
}
import java.util.concurrent.atomic.AtomicInteger;

public class Person extends Thread {

    private static AtomicInteger count = new AtomicInteger(10);

    public int decrement() {
        return count.decrementAndGet();
    }

    public void run(){
        while(count.get() > 0){
            int currentCount = this.decrement();
            System.out.print(currentCount + ",");
        }
    }
}
 类似资料:
  • 如何从多个线程同时访问静态变量。 如果我有这样的课 我需要访问线程1的值,比如 从线程2中,我需要设置如下值 这会导致内存冲突吗?。如果是,建议使用什么方法来处理这种情况?。

  • 我一直在读java中的同步,我有一个问题。我看到的例子是,一个类在一个本地对象上创建一个同步块。或者一个同步的方法。这两个都不适合我的情况。所以我有一个类的静态实例,它保存了整个应用程序的所有数据。该类上的变量被创建为“private”,我创建了getter来检索这些值。其中一些值一次只需要一个线程从应用程序中的不同类访问。由于它们被创建为private,所以我使用同步块,如下所示。。。 我可以通

  • 我使用TestNG是为了使用Appium并行运行自动移动测试。 我在一个类中有一个初始化AppiumDriver对象的方法。 我从我的TestNG类中调用这个方法,以便每个线程创建它自己的驱动程序实例。问题是,因为它是一个静态变量,当每个线程试图通过静态方法从另一个类访问驱动程序时: 始终存在冲突,因为每个线程只能访问AppiumDriver对象的单个实现。 我知道我可以绕过这一点,把所有这些代码

  • 问题内容: 任何人都可以解释以下语句吗……“静态同步方法和非静态同步方法不会互相阻塞-它们可以同时运行” 问题答案: 锁定对象在静态方法和非静态方法上有所不同。静态方法将Class对象用作锁(锁obj:),而非静态方法将实例对象用作锁,此时方法的调用已绑定到该对象(锁obj:)。

  • 问题内容: 这个问题与我在这里提出的问题有些相关。现在,我有一个“控制器”类,它由主要方法和所有摆动组件组成。有一个名为“ VTOL”的类,其中包含一个名为“ altitude”的变量(到目前为止,我已经将此变量声明为volatile)。 这是一个由在后台运行的线程组成的类: 首先,我最初面临的问题是我无法更新“ altitude”的值,在整个程序执行过程中它始终保持为0。所以我宣布它为易失性的(

  • 问题内容: 类的静态成员是否在每个进程或线程中仅作为单个实例存在?意思是每个线程都具有自己的类的静态成员变量副本吗? 我的猜测是每个过程,对吗? 问题答案: 静态 字段 为每个类加载器提供一个值。 如果需要每个线程的值,请设置static 。