java 调用单例_java – 多个线程如何调用单例对象的方法并在其上工作?

我想你必须区分你已经在内存中存储的内容和代码执行。

在一个Singleton对象中,你有:

>字段:它们存储在内存中。它们可以在多个线程之间共享,您不能保证它们保持一致(除非您使它们同步)。

要调用的方法:可以从多个线程调用它们。每个执行是独立的和线程安全的,除非他们访问不正确的共享字段。

现在来讨论你的问题:如果你在多个线程之间共享你的单例对象并同时访问它,那么每个线程都将执行Singleton对象的代码部分,包含在它自己的执行中。

另外如果你写一个Thread.currentThread()。getId();它基本上将您执行的线程ID返回到单例方法中,您将获得不同的ids,因为不同的线程正在执行自己的方法堆栈。无国籍意味着你没有任何领域的单身人士在他们之间分享!

关于无国籍和有状态的一句话

无状态意味着bean没有任何可修改的字段来共享。这意味着你在对象中只有方法或/和静态的东西,所以你可以在任何地方使用它们,总是返回相同的结果。您不必担心同步该字段的访问。

这是无状态的一个基本示例,假设你有一个只执行sum操作的类:

public class StatelessClass{

public int sum(int a, int b){

return a+b;

}

}

以同样的方式,您可以将其声明为抽象类(不可实例化),并使其方法成为静态,这意味着您不需要任何实例来调用其方法:

public abstract class StatelessClass{

/**

* I only sum objects

*/

public static int sum(int a, int b){

return a+b;

}

}

那么你可以使用它作为StatelessClass.sum(1,1);这实际上将是非常相似的,有一个Singleton对象本身,区别在于在Singleton你有一个唯一的实例在应用程序中共享。

以同样的方式,将一个被注入的字段提供给服务的访问也不被认为是改变对象的状态:

public class StatelessServiceClass{

private Service service;

public int sum(int a, int b){

return service.sum(a,b);

}

public void setService(Service serv){

this.service=serv;

}

}

但是,有一个可修改的字段使对象有效:

public class StatefulClass{

//This fields make the object STATEFUL

private int totalSum = 0;

public int sum(int a, int b){

int sum = a + b;

totalSum = totalSum + sum;

if (totalSum > 100)

System.out.println("This thread "+Thread.currentThread().getId()+

+" got it!");

return sum;

}

}

同时可以通过多个线程访问总和,您应该保证以同步的方式访问totalSum。打印的句子不能保证是真的,除非你这样做。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值