Java 哪里需要同步?

Java 哪里需要同步?,java,concurrency,Java,Concurrency,这里我的问题是,像str1、str2和s(sample2对象)这样的变量(函数fun的参数)在堆或堆栈中到底存储在哪里?你永远不会与str1和str2发生任何同步失败,因为这些变量是字符串,而且字符串类在Java中是不可变的。@Szilágy Don tát yes。抱歉。有一个大写的Sample2和一个小写的Sample2。他们指的是同一类吗?是打字错误吗?这个类是不可变的吗?我建议阅读有效的Java。这是一本帮助你掌握java代码技能的书。它将更详细地介绍同步等内容。@Kurtymckurt

这里我的问题是,像str1、str2和s(sample2对象)这样的变量(函数fun的参数)在堆或堆栈中到底存储在哪里?

你永远不会与str1和str2发生任何同步失败,因为这些变量是字符串,而且字符串类在Java中是不可变的。

@Szilágy Don tát yes。抱歉。有一个大写的
Sample2
和一个小写的
Sample2
。他们指的是同一类吗?是打字错误吗?这个类是不可变的吗?我建议阅读有效的Java。这是一本帮助你掌握java代码技能的书。它将更详细地介绍同步等内容。@Kurtymckurt感谢您的建议。我唯一的疑问是,像str1、str2、s这样的函数参数究竟将存储在堆或线程堆栈中的什么位置。如果你能回答这个问题,那就太好了。提前感谢!!!使用新创建的所有对象都是堆内存。字符串有一个隐含的new,因为您可以内联分配它们<代码>字符串str=“你好,世界!”什么abt s(样本2对象)?存储在哪里?如果是类sample2的字段(这里的语法对于Java不是很常规,通常提供getter和setter)。无论如何,s是一个字符串,字符串的值是不可变的,但是可以重新分配字段s。您可以将其视为更改指向另一个字符串的指针的值。对象存储在堆上,因此sample2的实例将存储在堆上。
public class sample1
{
    private static Map m = new HashMap();
    //....
    //.....
    //
    public void fun(String str1, String str2, sample2 s )
    {
        String str = str1 + str2 + s.getName();
        String value = m.get(str);
    }
}

public class sample2
{
    private String name;
            // ......
            // ........
            pubic String getName()
             {
                  return name;
             }
}