您的位置:首页 > 编程语言 > Java开发

Java偏量锁

2016-01-27 00:00 405 查看
import java.util.Random;
import java.util.concurrent.*;
/**
* Created by Administrator on 2016/1/27.
* JDK 1.8.0_65
*/
public class Test5 {
private static final int NTHREAD = 4;
private static final int COUNTER = 10000000;
private static Random random = new Random(123);
private static ExecutorService es1 = Executors.newSingleThreadExecutor();
private static ExecutorService es2 = Executors.newFixedThreadPool(NTHREAD);
private static ThreadLocal<Random> tl = new ThreadLocal<Random>() {
@Override
protected Random initialValue() {
return new Random(123);
}
};
private static class Task implements Callable<Long> {
private int mode = 0;
public Task(int mode) {
this.mode = mode;
}
public Random getRandom() {
if (mode == 0) {
return random;
} else if (mode == 1) {
return tl.get();
}else
return null;
}

@Override
public Long call() throws Exception {
long start = System.currentTimeMillis();
for(long i = 0; i < COUNTER; i++) {
getRandom().nextInt();
}
long end = System.currentTimeMillis();
System.out.println(Thread.currentThread().getName() + "spend " + (end - start) + " ms");
return (end - start);
}
}
public static void main(String... args) throws ExecutionException, InterruptedException {
Future<Long> futs1 = es1.submit(new Task(0));
long time1 = 0;
time1 += futs1.get();
System.out.println("+UseBiasedLocking : " + time1 + " ms");
//System.out.println("-UseBiasedLocking : " + time1 + " ms");
es1.shutdown();

Future<Long>[] futs2 = new Future[NTHREAD];
for(int i = 0; i  < NTHREAD ; i++) {
futs2[i] = es2.submit(new Task(0));
}
long time2 = 0;
for(int i = 0; i  < NTHREAD ; i++) {
time2 += futs2[i].get();
}
System.out.println("N Thread access one Random instance : " + time2 + " ms");

for(int i = 0; i  < NTHREAD ; i++) {
futs2[i] = es2.submit(new Task(1));
}
long time3 = 0;
for(int i = 0; i  < NTHREAD ; i++) {
time3 += futs2[i].get();
}
System.out.println("ThreadLocal access one Random instance : " + time3 + " ms");
es2.shutdown();
}
}


//可以明显的看到使用偏向锁,单线程时间减少,但是多线程时间延长
pool-1-thread-1spend 563 ms
+UseBiasedLocking : 563 ms

pool-2-thread-4spend 2121 ms
pool-2-thread-2spend 2130 ms
pool-2-thread-3spend 2309 ms
pool-2-thread-1spend 2310 ms
N Thread access one Random instance : 8870 ms
pool-2-thread-2spend 1563 ms
pool-2-thread-4spend 1714 ms
pool-2-thread-1spend 1603 ms
pool-2-thread-3spend 1784 ms
ThreadLocal access one Random instance : 6664 ms

//可以明显的看到禁用偏向锁,单线程时间延长,但是多线程时间减少
-UseBiasedLocking
pool-1-thread-1spend 760 ms
-UseBiasedLocking : 760 ms

pool-2-thread-1spend 1153 ms
pool-2-thread-3spend 1141 ms
pool-2-thread-4spend 1713 ms
pool-2-thread-2spend 2081 ms
N Thread access one Random instance : 6088 ms
pool-2-thread-1spend 1131 ms
pool-2-thread-3spend 1027 ms
pool-2-thread-4spend 1463 ms
pool-2-thread-2spend 1648 ms
ThreadLocal access one Random instance : 5269 ms
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java