多线程的匿名内部类问题

niceHot 2020-09-20 09:32:48
Object lock = new Object();
for(int i = 0;i < threads.length; i++){
threads[i] =
new Thread(new Runnable(){
@Override
public void run() {
for(int k = 0; k < 100000; k++){
synchronized (lock){
count2++;
}
}
}
});
}
start = System.currentTimeMillis();

for(Thread t : threads) t.start();

for(Thread t : threads) t.join();

end = System.currentTimeMillis();

System.out.println("synchronized使用Runnable匿名类: " + count2 + " time: " + (end-start));
//----------------------------------------------------------
Object lockb = new Object();
for(int i = 0;i < threads.length; i++){
threads[i] =
new Thread(()->{
/*@Override
public void run() {*/
for(int k = 0; k < 100000; k++){
synchronized (lockb){
count4++;
}
}

});
}
start = System.currentTimeMillis();

for(Thread t : threads) t.start();

for(Thread t : threads) t.join();

end = System.currentTimeMillis();

System.out.println("synchronized匿名类: " + count4 + " time: " + (end-start));
...全文
1560 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
冰思雨 2020-09-21
  • 打赏
  • 举报
回复
实现Runnable接口的匿名类与Thread类是两个不同的类,run函数在调用的时候,会有一次类切换,从Thread类切换到匿名类。 继承Thread类情况,不存在Thread类向继承的类的切换。 由于创建的线程对象过于多了,操作系统的执行效率反而降低,从而引起两个不同方案的差别越发的显著。平常几个线程的情况下,差别并不会太明显。
niceHot 2020-09-21
  • 打赏
  • 举报
回复
引用 3 楼 qq_39936465 的回复:
[quote=引用 1 楼 niceHot 的回复:]运行结果分别是 synchronized使用Runnable匿名类: 100000000 time: 6502 synchronized匿名类: 100000000 time: 3889 为啥差别这么大?
可能是这样,第二个用的是lambda的函数接口,应该可以反复使用的,而匿名类不可以。[/quote] 没很明白,能详细说一下吗
qq_39936465 2020-09-21
  • 打赏
  • 举报
回复
引用 1 楼 niceHot 的回复:
运行结果分别是 synchronized使用Runnable匿名类: 100000000 time: 6502 synchronized匿名类: 100000000 time: 3889 为啥差别这么大?
可能是这样,第二个用的是lambda的函数接口,应该可以反复使用的,而匿名类不可以。
  • 打赏
  • 举报
回复
编译器优化的结果
niceHot 2020-09-20
  • 打赏
  • 举报
回复
运行结果分别是 synchronized使用Runnable匿名类: 100000000 time: 6502 synchronized匿名类: 100000000 time: 3889 为啥差别这么大?

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧