【问题标题】:How a single program is shared with multiple clients? (Means do multiple client threads share same objects?)单个程序如何与多个客户端共享? (意味着多个客户端线程是否共享相同的对象?)
【发布时间】:2016-03-06 16:09:07
【问题描述】:

“一个程序如何被多个客户端访问”?

“是否为每个客户端生成程序的任何副本以使用该程序”?

这个问题太简单了,但还是有点混乱。 考虑下面的一段伪代码-

Class Some {
// Some code
}
main(){
Some s= new Some();
}

所以,现在如果客户端试图访问这段代码,就会创建一个对象's'。

问题是是否会为每个访问代码的客户端(或客户端请求)创建此对象,或者此对象将在生命周期中创建一次(意味着代码的部署)?

我知道 servlet(或任何其他基于语言的容器)用于处理客户端请求,但我询问的是我们编写的供多个客户端使用的程序。

【问题讨论】:

  • 一个程序被多个客户端访问的方式有很多种。您能否提供更多有关您的程序/堆栈/架构的性质的背景信息?
  • 该问题以非常令人困惑的方式使用了“程序”、“访问”、“客户”、“复制”、“生成”、“客户请求”和“消费”等词,而且方式超出了他们的常用范围接受的意义。似乎作者没有理解一些基本概念。没有大量猜测是不可能写出答案的。

标签: java php multithreading jvm


【解决方案1】:

为了理解这个概念,我认为你需要深入研究 Java 内存模型的细节。我认为这是link is a great resource for beginners

Class Some {
  // Some code
}
main(){
  Some s= new Some();
}

问题是是否会为每个访问代码的客户端(或客户端请求)创建此对象,或者此对象将在生命周期中创建一次(意味着代码的部署)?

当您传递/访问 s 时,就是传递 s 的值,它是对 Some 对象的引用。 (s 本身是按值传递的)不会改变 s 引用的对象。 Java 是严格按值传递的)

当您使用 s.someDataMember 更改该对象中的值时,另一个客户端再次查看 someDataMember 的值将看到更新后的值。

基本上,Java 不会复制对象,除非您真的要求它这样做。现在我在同一个 JVM 进程的上下文中指代这个。

现在考虑这个对象是一个不可变对象。

【讨论】:

  • 我想如果你阅读了上面关于 Java 内存模型的文章,你的问题就会得到解答。
  • 我阅读了您的文章,其中说堆包含在您的 Java 应用程序中创建的所有对象,无论哪个线程创建了该对象。所有对象和对象的成员变量都与对象本身一起存储在堆中。现在它将我的问题缩小到是否将为每个线程创建对象“s”? (我认为它将为每个线程创建)。
  • 所有分配的对象只能驻留在堆中,不能驻留在栈中。线程仅将对此类对象的引用作为局部变量保存在其堆栈中。
  • 堆上的对象可以被所有引用该对象的线程访问。当一个线程可以访问一个对象时,它也可以访问该对象的成员变量。如果两个线程同时调用同一个对象的方法,它们都可以访问对象的成员变量,但每个线程都有自己的局部变量副本。
猜你喜欢
  • 2016-09-19
  • 2019-10-28
  • 2016-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多