私はシングルトンクラスの2つの実装を持っています
public class Test2 {
private static Test2 _instance=new Test2();
private Test2(){
}
public static synchronized Test2 getInstance(){
if(_instance == null){
_instance = new Test2();
}
return _instance;
}
}
と:
public class TestSingleton {
private static TestSingleton _instance=new TestSingleton();
private TestSingleton(){
}
public static TestSingleton getInstance(){
if (_instance == null) {
synchronized (TestSingleton.class) {
if (_instance == null) {
_instance = new TestSingleton();
}
}
}
return _instance;
}
かかった時間の観点から私の発見をパラメータ化したいのですが、私がしたことはこれです:
Callable<Long> task = new Callable<Long>() {
@Override
public Long call() throws Exception {
long start = System.nanoTime();
**TestSingleton.getInstance();**
long end = System.nanoTime();
return end - start;
}
};
for (int i = 0; i < 100000; i++) {
futList.add(es1.submit(task));
}
for (Future<Long> fut : futList) {
try {
totalTime1.getAndAdd(fut.get());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("Time taken by S1 " + totalTime1.get());
.
.
ExecutorService es2 = Executors.newFixedThreadPool(threadpool);
Callable<Long> task1 = new Callable<Long>() {
@Override
public Long call() throws Exception {
long start = System.nanoTime();
Test2.getInstance();
long end = System.nanoTime();
return end - start;
}
};
for (int i = 0; i < 100000; i++) {
futList1.add(es2.submit(task1));
}
for (Future<Long> fut : futList1) {
try {
totalTime2.getAndAdd(fut.get());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("Time taken by S2 " + totalTime2.get());
私が得た結果は次のとおりです。
S1 にかかった時間 4636498 S2 にかかった時間 5127865
最初の質問はこれが正しいアプローチですか? getinstances
次に、両方でメソッドにコメントを付けてもcall()
、2 つの同一ブロックの実行時間が異なります。
S1 にかかった時間 1506640 S2 にかかった時間 2156172