Java中同一对象的不同实例上的多线程
我已经知道,每个类加载器,每个类字节码都被加载到内存一次,因此当一个线程执行一些方法的字节码,另一个线程来了?
1线程 – > 1类 – Foo类没有问题. X线程 – > 1个实例 – 类Foo ==需要处理这是很清楚的. X线程 – > X的各个实例 – 类Foo == ???? 我应该确保在方法中没有什么混乱吗? 更新: 我看到我的问题不清楚一些,这里是一个数字的例子 我有一个没有同步的类Foo的对象! 我有5个Foo实例,5个线程在每个线程中运行,并访问实例级参数,例如: class FOO { private SomeObject someObject=new SomeObject(); private void problematicMethod(Data data) { someObject.doSomethingWithTheData(data); data.doSomethingWithSomeObject(someObject); // any way you want it use the data or export the data } } 我在问这里是否有一个问题,因为这个类只有1个字节的代码,这个对象的5个实例访问这个字节代码,所以如果我想防止它们在同一个字节代码上重叠,那我该怎么办做? 谢谢, 解决方法
类加载和字节码在这里是无关紧要的.字节代码是JVM解释并编译为本地机器代码的一组类似于Assembly的指令.多个线程可以安全地遵循编码为字节码的指令集.
大部分是正确的如果只有一个线程,那么没有任何立即需要使任何线程安全.然而,忽视线程安全将限制增长和重新使用.
那么是的,对于线程可见性原因,并确保关键区域是原子执行的,使用同步或锁定技术是非常重要的.当然这一切都取决于吗?如果你的类没有状态(实例或类变量),那么你真的不需要使其线程安全(认为实用程序类,如Java的Executors,Arrays,Collections类).
如果每个线程都有自己的Test类,并且没有单个实例在多个线程之间共享,那么这与第一个例子是一样的.如果Test的一个实例被两个或多个线程引用,那么与第二个例子相同.
类变量是Java中的静态变量.已经发布了两个答案,强调使用synchronized来防止多个线程同时修改类变量的重要性.没有提到使用synchronized或volatile的重要性,以确保您看不到类变量的陈旧版本. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |