次のコードのロックなし実装とロックなし実装の比率はどちらが良いでしょうか? jmeter を使用して 1 秒あたり 20 リクエストを作成しています。ロック コードなしの test() のスリープ操作の出力のほとんどは 500 ミリ秒とは大きく異なりますが、ロック コードの出力は基本的に 500 ミリ秒です。 1.2 ミリ秒の差、この問題は非常に奇妙です....
test()
1. まず最初に、Synchronized は AtomicXX クラスと比較されるのではなく、ReentrantLock クラスと比較されることが多くありますので、ご自身で検索してください。
2. ロックなしまたはロックに関する質問については、テストコード b のコードに問題があります。
前のスレッドがロックを解放するまで、後続のスレッドは実行を再開します。ロックの存在により、20 個のリクエストは順次実行 に似ており、この層は jvm によってスケジュールされます
cas 操作は実際には常に実行されており (cas 操作の実行を継続的に試行します)、無限ループがより多くの CPU リソースを消費することがわかっています。スレッドが多いほど、ここでの CAS 操作も多くなり、必然的に CPU 使用率が急増します。理論的には、メソッド B のコードが常に 20 個のアクティブな作業スレッドになるはずです。CPU とスレッド モデルは別のトピックです。 、スレッド数のチューニングは、jvm の比較的高度なトピックです。興味がある場合は、自分でググってください
1. まず最初に、Synchronized は AtomicXX クラスと比較されるのではなく、ReentrantLock クラスと比較されることが多くありますので、ご自身で検索してください。
2. ロックなしまたはロックに関する質問については、テストコード b のコードに問題があります。
前のスレッドがロックを解放するまで、後続のスレッドは実行を再開します。ロックの存在により、20 個のリクエストは順次実行 に似ており、この層は jvm によってスケジュールされます
cas 操作は実際には常に実行されており (cas 操作の実行を継続的に試行します)、無限ループがより多くの CPU リソースを消費することがわかっています。スレッドが多いほど、ここでの CAS 操作も多くなり、必然的に CPU 使用率が急増します。理論的には、メソッド B のコードが常に 20 個のアクティブな作業スレッドになるはずです。CPU とスレッド モデルは別のトピックです。 、スレッド数のチューニングは、jvm の比較的高度なトピックです。興味がある場合は、自分でググってください
。