スレッドセーフを理解しようとしているので、このクラスがスレッドセーフかどうか知りたいですか?2つのスレッドがいつでもその変数にアクセスしようとすると、次の理由でスレッドセーフであるように見えます。
- 最終変数は不変であるため、スレッドセーフです。
- getterとsetterは同期されているため、mObjectは、一度に1つのスレッドでのみ取得または設定できます。したがって、2つのスレッドが異なる値を読み取る可能性はありません。
- メソッドchangeObj()は同期されませんが、クラス変数(つまり、mObject)を処理するその中のブロックは同期されます。
私が間違っているのか、このクラスがスレッドセーフではないのか教えてください。
public class MyClass{
private final String = "mystring"; //thread safe because final
private AnObject mObject;
public MyClass(){
//initialize
}
//only one class can set the object at a time.
public synchronized void setObj(AnObject a){
mObject = a;
}
//two threads trying to get the same object will not read different values.
public synchronized AnObject getObj(){
return mObject;
}
//better to synchronize the smallest possible block than the whole method, for performance.
public void changeObj(){
//just using local variables (on stack) so no need to worry about thread safety
int i = 1;
//i and j are just to simulate some local variable manipulations.
int j =3;
j+=i;
synchronized(this){
//change values is NOT synchronized. Does this matter? I don't think so.
mObject.changeValues();
}
}
}