2017-06-12 6 views
0

私は、共有データにアクセスし、同期化されたと宣言されているメソッドAを持つトップレベルサービスを持っています。メソッドAは内部クラスのメソッドBを呼び出し、内部クラスの一部の共有データにアクセスします。メソッドが同期メソッド内から呼び出された場合、内部メソッドは共有可能な変更可能なデータへのスレッドセーフなアクセスですか?

BがトップレベルサービスのAPIからのみ呼び出され、公開されていないことを保証できる場合でも、Bをsynchronizedとして宣言する必要はありますか?または、Bのスレッドセーフであることを保証するのに十分なAの同期宣言ですか?

Bの同期を宣言する際のパフォーマンス上のペナルティはありますか?

+0

なります

syncronized(object) { doSomething(); } void doSomething() { do thing one; do thing two; } 

と同じですあなたのデータが共有されている場合、それは複数のスレッドによってアクセスされます。可視性が必要です。 –

答えて

0

キーは本当にBがどこか他の場所から呼び出されていないということです。これが保証されている限り、あなたは大丈夫です。

Bを同期させるとパフォーマンスが低下することがあります。

0

はい、問題ありません。

syncronized(object) { 
    do thing one; 
    do thing two; 
} 

は、あなたが与えてくださいすることができていれば、ロックがオブジェクトに開催されたとして、syncronizedブロック内部に入るすべてがアトミック操作

関連する問題