1
for(int ii = 0; ii < 3; ii++)
    executor.execute(new someClass);

someFunction();
someFunction();
someFunction();

どこ

public static void someFunction(){
    synchronized(lock){
       for(int ii = 0; ii < long.MAX_VALUE; ii++);
    }
}


private class someClass implements Runnable {

   public void run() {          
     someFunction(); //someFunction() is  a synchronized function
   }
}

これがかなり漠然とした質問かもしれない場合は申し訳ありません。同期した someFunction() を 3 回連続して呼び出し、別の時間にはそれぞれが someFunction() のタスクを実行する 3 つのスレッドを使用します。同期されているため、一度にアクセスできるのは 1 スレッドだけなので、3 スレッドと 1 スレッドの速度差はほぼ同じです。また、someFunction() を変更したり、非同期にしたりすることも許可されていません。スレッドの使用方法からマルチスレッドの方法で高速化する方法があるかどうか疑問に思っていましたか? たぶん、スレッドがどのようにキューに入れられるかなどでしょうか?助けてくれてありがとう。

4

2 に答える 2

6

いいえ。(同じオブジェクトで) 同期されたメソッドを同時に複数回実行する方法はありません。それが同期キーワードのポイントのようなものです。

同期はパフォーマンスのボトルネックになる可能性がありますが、それを減らす唯一の方法は、それらの重要なセクションで実行する必要がある作業の量を減らすことです。多くの場合、コードは過度に保守的であり、すべてがその同期ブロックにある必要はないかもしれません。しかし、これはコードの深い理解と書き直しを必要とするものであり、魔法の設定を介して調整できるものではありません (また、同期を削除しすぎると、問題が発生する可能性があります。マルチスレッド コードを正しく作成することは困難です)。

于 2012-11-15T08:53:41.373 に答える
0

実装したいことを最もよく表している実際の状況を考えてください。あなたが実装しようとしているものの例を教えてください。理解に役立ち、有用で実用的なソリューションを提供します。

この質問は非常に漠然としており、さまざまな方法で解釈できます。

于 2012-11-15T10:00:24.453 に答える