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