同期とAtomicXXX効率の比較

Javaでは、私はあなたがリソースを蓄積する10個のスレッドを使用する場合、私は、西安、スレッドセーフで++ ++と、エラーが発生します。同期とアトミックは、スレッドの安全性を達成するための一般的な方法です。そして、両方の効率が良いですか?
どのような状況の原則に沿って、法の精神は、簡単なテストコードを記述します。

パブリッククラスAtomicTest {
int型のカウント= 0;
AtomicInteger COUNT1 =新しいのAtomicInteger(0); // 2283 1895 2328 2015 2264

// 57 56 55
同期ボイドM(){
ため(INT i = 0; I <150000; iは++){
++数えます。
}
}

ボイドN(){
{(; iが150000を<I ++は、I = 0の整数)ため
count1.incrementAndGet();
}
}

公共の静的な無効メイン(文字列[]){
長い開始=にSystem.currentTimeMillis();
AtomicTestトン=新しいAtomicTest();

一覧<スレッド>スレッド=新しいArrayListを<>();

以下のために(INT i = 0; iが10 <; I ++){
threads.add(新しいスレッド(T :: mは、 "スレッド" + I))。
}
threads.forEach((O) - > o.start());
threads.forEach((O) - > {
試みる{
o.join();
}キャッチ(InterruptedExceptionあるE){
e.printStackTrace();
}
})。
System.out.println( "増加- >" + t.count)。
System.out.println(のSystem.currentTimeMillis() -開始)。

System.out.println( "----------------------------------");


長いSTART1 =にSystem.currentTimeMillis();
)(T1 =新しいAtomicTest AtomicTest。

一覧<スレッド>スレッド=新しいArrayListを<>();

以下のために(INT i = 0; I ++; iは10 <){
thread.add(新しいスレッド(T1 :: nは、 "スレッド" + I))を、
}
thread.forEach((O) - > o.start());
thread.forEach((O) - > {
試みる{
o.join();
}キャッチ(InterruptedExceptionあるE){
e.printStackTrace();
}
})。
System.out.println( "アトミック- >" + t1.count1)。
System.out.println(のSystem.currentTimeMillis() - START1)。
}
}


試験が見つかった後、この方法は、同期必ずしも原子によるものではない
場合同時低い(150000未満)、原子がより効率的な同期
原子より効率的な同期、ときに同時(150000より大きい)高い
許容* 150000ネイティブテストデータ、

要約:
同期:ヘビー級操作は、ペシミスティック・ロックに基づいて、ロックがリエントラントであってもよいです。
AtomicInteger:楽観的、CASで達成
常にエラーとより多くの時間がかかる修正、大型で複雑なとき、アトミック誤り確率が増加します

オリジナルのリンクをします。https://blog.csdn.net/baidu_35773818/article/details/89604328

おすすめ

転載: www.cnblogs.com/renjiaqi/p/11323461.html