2017-09-26 6 views
0

私は外部APIのクラスを持っており、そのインスタンスを作成してそのスレッドのメソッドに別のスレッドからアクセスしたいと考えています。私の質問は、次のコードのコメントのようです:外部APIオブジェクトを持つjavaのスレッドセーフ

import java.util.concurrent.Executors; 

public class ThreadSafetyQuestion { 


    static class ExternalAPIObject { 
     void method(){ 

     } 
    } 

    private static volatile ExternalAPIObject obj; 

    static synchronized ExternalAPIObject syncGetObject(){ 
     return obj; 
    } 

    public static void main(String[] args) { 
     Executors.newSingleThreadExecutor().submit(()-> { 
      ThreadSafetyQuestion.syncGetObject().method();//Is this thread safe? 

      ExternalAPIObject externalAPIObject = ThreadSafetyQuestion.syncGetObject(); 
      //do some other stuff 
      externalAPIObject.method();//I doubt this is thread safe. How can I access this method from multiple threads in a safe way? 
     }); 
    } 
} 

答えて

3

あなたは間違った視点から見ています。スレッドセーフとは、複数のスレッドがこれらのメソッドを呼び出す場合、何もしません。badが発生します。それは本当に単純です:method()が同期の形式なしで "内部データ"を操作する場合、同じオブジェクト上に複数のスレッドがmethod()を呼び出すと問題が発生する可能性があります。

このように、あなたがあなたの質問に書いたことはすべて問題ではありません!

唯一の問題:何正確これらの方法は、あなたを呼び出していることを行うのですか?言い換えれば、異なるスレッドのメソッドを呼び出すためのシングルトンを設定することに意味はありません。または、オブジェクト参照をに変更すると、になります。これらのアイデアはすべて、ゼロを「スレッドセーフ」というものに追加します。 method()同じオブジェクトで呼び出すことができます。

代わりに行う必要があること:慎重にを確認してください。あなたが呼び出しているメソッドが何をしているかを確認してください。

そして、あなたがそこに行くにしたくない場合は:その後、method()への呼び出し単に代表団シングルシングルトン作成 - しかし、それは​​としてマークされ、そのメソッドを持っています。

ので:あなたは、外部APIについて何も知らない場合 - その後、1つの保守的アプローチは、常にすべてのメソッド順次に確認することです。もちろん、それは非常に否定的な方法でパフォーマンスに影響する可能性があります。

短いストーリー:あなたが欠けているようです Javaのマルチスレッドの概念を理解しています。試行錯誤してはいけません - むしろ一歩踏み込んでこのトピックを深く勉強してください!真剣に:マルチスレッドのエラーは微妙で、数日か数か月間気づかないことがよくあります。あなたが何をしているのかを知るための第一歩(何か問題が起きたときにいくつかのキーワードを投げるのではなく、このことやその効果について読んでいる)。

+0

ExternalAPIObjectの個々のメソッドを同期ラッパーメソッドでラップする必要があると言っていますか?うーん、私はあなたのアドバイスを受け取り、トピックについてもう少し詳しく研究します。 – dQw4w9WyXcQ

関連する問題