多くのスレッドによって頻繁に読み取られるオブジェクトobjがありますが、定期的に1つのスレッドによってのみ更新されます。更新は長い間隔(たとえば10分)後に発生します。
データはあまり国境を越えていません。つまり、読み取りスレッドがしばらくの間古いデータ(古い)を取得した場合、それは完全に問題ありません。
今、私は同期のために次のアプローチを使用することを考えました:
final Object lock = new Object();
private MyObject obj = new MyObject(); //this is the data
public String getDataFieldName(){
synchronized(lock){
return this.obj.name;
}
}
/*the following code is wrong right?As its just synchronizes the code for getting reference.But after getting reference read thread R1 may try to get data while write Thread is modifying data.Will that give exception?How to solve this? */
public String getData(){
synchronized(lock){
return this.obj;
}
}
//only one thread can update.But how multipe threads can read at once?
public updateData(args ) {
synchronized(lock){
//do update
}
}
私の質問は次のとおりです。
1つのスレッドだけがデータを読み取る必要はありません。読み取りは並列である必要があります。
読み取りと書き込みを同期するにはどうすればよいですか?書き込みスレッドが更新中であり、読み取りスレッドが読み取り中の場合、例外を取得する必要はありません。読み取りが古いデータを取得する場合は問題ありません。3)書き込みスレッドの更新中に読み取りスレッドが読み取り中の場合、例外が発生しますか?問題はありますか?