【发布时间】:2017-10-24 10:44:34
【问题描述】:
我已经阅读了很多关于线程安全的内容,并且对于是否有多个对象实例会影响线程安全感到困惑。这是一个详细说明的示例:
假设我们有一个名为 RGBColor 的类,用户将设置红色、绿色和蓝色的值,然后返回颜色。
Public Class RGBColor {
private int red;
private int green;
private int blue;
Public RGBColor(int red, int green, int blue){
this.red = red;
this.green = green;
this.blue = blue;
}
Public void setColor(int red, int green, int blue){
this.red = red;
this.green = green;
this.blue = blue;
}
Public RGBColor getColor(){
return this;
}
}
现在如果程序创建了该类的多个实例,例如:
RGBColor red = new RGBcolor(255,0,0);
RGBColor blue = new RGBcolor(0,0,255);
现在问题来了。类的这些实例是完全独立的吗?我的意思是线程安全会是一个问题吗?毕竟据我了解,它们应该是完全不同的对象,在 RAM 中具有不同的分配。
另一个问题是变量和方法是否是静态的,例如。
Public Class RGBColor {
private static int RED;
private static int GREEN;
private static int BLUE;
Public static void setColor(int red, int green, int blue){
RED = red;
GREEN = green;
BLUE = blue;
}
}
在线程安全方面如何处理静态变量和方法?
ps:我已经更新了第二个示例,因为它有缺陷。
【问题讨论】:
-
第一个问题的答案是肯定的。对象中的方法是“独立的”。对对象调用方法仅影响该对象。问题 2 的答案是您必须同步呼叫。在您的示例中,所有线程都会更改相同的值,所以也许没关系。顺便说一句,你不能在静态方法中调用
this。 -
@JackFlamp 好的,非常感谢您的澄清,我也更新了帖子。我完全错过了我一直在对静态变量调用
this。非常感谢:)
标签: java multithreading static thread-safety multiple-instances