我只是Java的初学者,偶然发现了多线程应用程序。我知道这个问题与此处的某些帖子类似,但是我找不到适合自己查询的更好答案。基本上,我想将对象传递给静态方法,该方法将仅基于对象的值/属性返回输出。对于每次调用,我都在创建该对象的新实例,并且绝不会以任何方式修改该方法内部的对象。现在,我的问题是,JVM是否会为多个线程的每次调用创建一个新的静态方法实例及其本地变量到堆栈中(不包括将在堆上的对象)?为了清楚地了解我要实现的目标,以下是我的代码:

TestConcurrent.java

import classes.Player;

public class TestConcurrent
{
    private static int method(Player player)
    {
        int y = (player.getPoints() * 10) + 1;

            try {
                    Thread.sleep(1000);
            } catch (InterruptedException e) {}

            return ++y;
    }

    public static void main(String[] args) throws Exception
    {
        // Create 100 threads
        for(int i=1;i<=100;i++)
        {
            final int j = i;
            // Create a new Thread
            new Thread()
            {
                public void run()
                {
                    // Create a new instance of the Player class
                    Player player = new Player(j,j,"FirstName" + j, "LastName" + j);
                    // Call static method() and pass a new instance of Player class
                    System.out.println("Thread " + j + ": " + TestConcurrent.method(player));
                    // Check the values of the Player class after the call to the static method()
                    System.out.println("Player" + player.getAcctId() + " : Points=" + player.getPoints() + " Name=" + player.getFirstName() + " " + player.getLastName());
                }
            }.start();
        }
    }

}

Player.java
package classes;

public class Player
{
    private int acctId, points;
    String firstName, lastName;

    public Player(int acctId, int points, String firstName, String lastName)
    {
        this.acctId = acctId;
        this.points = points;
        this.firstName = firstName;
        this.lastName = lastName;
    }

    public int getAcctId() {
        return acctId;
    }
    public void setAcctId(int acctId) {
        this.acctId = acctId;
    }
    public int getPoints() {
        return points;
    }
    public void setPoints(int points) {
        this.points = points;
    }
    public String getFirstName() {
        return firstName;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}

输出:

由于我没有输入synced关键字,因此每次输出都会有所不同,它看起来类似于以下内容:(输出是正确的,而且正是我所期望的,我只想澄清一下我在正确的道路上因为我不想使用同步,因为它会减慢进程,因为每个线程将不得不等待另一个线程完成才能调用静态方法)
Thread 2: 22
Player8 : Points=8 Name=FirstName8 LastName8
Thread 22: 222
Thread 26: 262
Thread 23: 232
Player23 : Points=23 Name=FirstName23 LastName23
Thread 21: 212
Player21 : Points=21 Name=FirstName21 LastName21
Thread 25: 252
Player25 : Points=25 Name=FirstName25 LastName25
Thread 20: 202
Thread 19: 192
Thread 24: 242
Player24 : Points=24 Name=FirstName24 LastName24
Player9 : Points=9 Name=FirstName9 LastName9
Thread 28: 282

最佳答案



是的,完全正确。

如果静态方法仅引用局部变量,则它是自动线程安全的。 (实际上,这也适用于非静态方法。)

一般来说,我会说,如果可能,应避免使用static。通常,由于静态成员在某种意义上是全局的,因此它使代码更难测试和推理。

关于java - 多个线程将对象引用传递给静态帮助器方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10647683/

10-14 18:21
查看更多