java锁消耗的性能,主要是多线程先cpu对线程的调度消耗的,在有锁的情况下,cpu要调度某个线程可用,某个线程不可用,这些本来就是要消耗系统资源的。所以个人认为,多线程下性能下降的原因主要是两方便的,第一 锁消耗性能,第二是线程调度消耗性能。以下通过两个方便为别测试。
首先是单线程下,锁消耗的性能:
public class Test {
private static final int num = 500000000;
public void cal(){
long start = System.currentTimeMillis();
int result = 0;
for (int i = 0; i < num; i++) {
result +=1;
}
System.out.println("cal计算结果为: "+result+". 计算的时间为:"+(System.currentTimeMillis()-start));
}
public void cal2(){
long start = System.currentTimeMillis();
int result = 0;
for (int i = 0; i < num; i++) {
synchronized (this) {
result +=1;
}
}
System.out.println("cal2有锁计算结果为: "+result+". 计算的时间为:"+(System.currentTimeMillis()-start)+"\r");
}
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
Test test = new Test();
test.cal();
test.cal2();
}
}
}
以下是执行结果为了测试的效果,执行10次看平均值:
cal计算结果为: 500000000. 计算的时间为:271
cal2有锁计算结果为: 500000000. 计算的时间为:15220
cal计算结果为: 500000000. 计算的时间为:262
cal2有锁计算结果为: 500000000. 计算的时间为:1970
cal计算结果为: 500000000. 计算的时间为:270
cal2有锁计算结果为: 500000000. 计算的时间为:1228
cal计算结果为: 500000000. 计算的时间为:263
cal2有锁计算结果为: 500000000. 计算的时间为:1230
cal计算结果为: 500000000. 计算的时间为:262
cal2有锁计算结果为: 500000000. 计算的时间为:1355
cal计算结果为: 500000000. 计算的时间为:262
cal2有锁计算结果为: 500000000. 计算的时间为:1223
cal计算结果为: 500000000. 计算的时间为:263
cal2有锁计算结果为: 500000000. 计算的时间为:1234
cal计算结果为: 500000000. 计算的时间为:266
cal2有锁计算结果为: 500000000. 计算的时间为:1251
cal计算结果为: 500000000. 计算的时间为:264
cal2有锁计算结果为: 500000000. 计算的时间为:1230
cal计算结果为: 500000000. 计算的时间为:269
cal2有锁计算结果为: 500000000. 计算的时间为:1255
从以上的测试结果可以看出有锁的要比无锁的,性能消耗大概在5倍,而且第一次执行的时候相差的都无法让人接受,当然和计算机的配置还是有一定的关系的,但是从这个简单的测试上可以看出,锁对程序的性能影响
以下是多线程下,计算的结果,本次测试启用10个线程,每个线程单独计算五亿次
public class Test {
private static final int num = 500000000;
public void cal(){
long start = System.currentTimeMillis();
int result = 0;
for (int i = 0; i < num; i++) {
result +=1;
}
System.out.println("cal计算结果为: "+result+". 计算的时间为:"+(System.currentTimeMillis()-start));
}
public void cal2(){
long start = System.currentTimeMillis();
int result = 0;
for (int i = 0; i < num; i++) {
synchronized (this) {
result +=1;
}
}
System.out.println("cal2有锁计算结果为: "+result+". 计算的时间为:"+(System.currentTimeMillis()-start)+"\r");
}
public void cal3(){
long start = System.currentTimeMillis();
int result = 0;
int index = 0;
while(index<num){
synchronized (this) {
result+=1;
index++;
}
}
System.out.println(Thread.currentThread().getName()+" "+"有锁计算结果为: "+result+". 计算的时间为:"+(System.currentTimeMillis()-start)+"\r");
}
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
// Test test = new Test();
//
// test.cal();
// test.cal2();
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
Test test = new Test();
test.cal3();
}
}, "线程"+i);
thread.start();
}
}
}
接下来看运算结果,表明多线程下的性能下降的更厉害
线程5 有锁计算结果为: 500000000. 计算的时间为:62796
线程7 有锁计算结果为: 500000000. 计算的时间为:62957
线程9 有锁计算结果为: 500000000. 计算的时间为:62961
线程1 有锁计算结果为: 500000000. 计算的时间为:68265
线程2 有锁计算结果为: 500000000. 计算的时间为:85124
线程0 有锁计算结果为: 500000000. 计算的时间为:101602
线程3 有锁计算结果为: 500000000. 计算的时间为:103658
线程6 有锁计算结果为: 500000000. 计算的时间为:116141
线程8 有锁计算结果为: 500000000. 计算的时间为:122378
线程4 有锁计算结果为: 500000000. 计算的时间为:122773
相关推荐
提升Java的锁性能Java开发Java经验技巧共5页.pdf.zip
4种常用Java线程锁的特点,性能比较、使用场景 线程(thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发...
│ 开篇词 Java 性能优化,是进阶高级架构师的炼金石.mp4 │ 02 理论分析:性能优化有章可循,谈谈常用的切入点.mp4 │ 03 深入剖析:哪些资源,容易成为瓶颈?.mp4 │ 04 工具实践:如何获取代码性能数据?....
改善Java中锁的性能_.docx
很多人都会称呼它为重量级锁,但是随着Java SE1.6对Synchronized进行了各种优化之后,有些情况下它并不那么重了,本文详细介绍了Java SE1.6中为了减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级锁,...
5.2 锁机制对比 5.3 增加程序并行性 5.4 JDK类库使用 5.5 本章小结 第6章 JVM性能测试及监控 6.1 监控计算机设备层 6.2 监控JVM活动 6.3 本章小结 第7章 JVM性能调优建议 7.1 JVM相关概念 7.2 JVM系统架构...
第8章介绍了Java虚拟机对多线程,尤其是锁的支持。第9~~10章介绍了虚拟机的核心——Class文件结构,以及虚拟机中类的装载系统。第11章介绍了虚拟机的执行系统和字节码,并给出了通过ASM框架进行字节码注入的案例。
第8章介绍了Java虚拟机对多线程,尤其是锁的支持。第9~10章介绍了虚拟机的核心——Class文件结构,以及虚拟机中类的装载系统。第11章介绍了虚拟机的执行系统和字节码,并给出了通过ASM框架进行字节码注入的案例。
避免使用Java序列化14讲多线程之锁优化(下):使用乐观锁优化并行操作16讲多线程调优(下):如何优化多线程上下文切换17讲并发容器的使用:识别不同场景下最优容器21讲深入JVM即时编译器JIT,优化Java编译25讲答疑...
Java中使用锁是为了在多线程程序中保证同步访问共享资源的正确性和一致性。在多线程环境下,多个线程可以同时访问共享资源,这可能导致数据的不一致性和错误的结果。例如,如果两个线程同时更新同一个变量,那么可能...
四个Java常见分布式锁的选型和性能对比.rar
• 熟悉Java多线程并发中线程基本方法,线程池,线程生命周期,熟悉Java锁中常见锁分类(乐观/悲观锁、自旋锁、独/共享锁、可重入锁、公平/非公平锁、分段锁、偏向锁,轻/重量级锁)和基本的锁升级策略
级锁使用产生的性能消耗。在解释轻量级锁的执行过程之前,先明白一点,轻量级锁所适应的场 景是线程交替执行同步块的情况,如果存在同一时间访问同一锁的情况,就会导致轻量级锁膨胀 为重量级锁。
01 理论分析:性能优化,有哪些衡量指标?...16 案例分析:常见Java代码优化法则.mp4 17 高级进阶:JVM如何完成垃圾回收?.mp4 18 高级进阶:JIT如何影响JVM的性能?.mp4 19 高级进阶:JVM常见优化参数.mp4
PPT中介绍了在Java语言中加入乐观锁从而提高性能的一种方法。 Android的Dalvik和ART虚拟机中的锁都是采用了这种方式。
Day7:缓存与数据库锁方案.rar Day8:库存问题及数据一致性.rar Day9:token及队列的应用.rar Day10:验证码及过载防批量黄牛抢单技术.rar/n(P9Q9[;H:y3d+X5t Day11:其他问题及扩展方案.rar2O+k$}6w#R.Q4~"}"Z Day12:...
乐观锁与悲观锁 设计模式 数据库 性能优化 ActiveMQ消息中间件 Dubbo JVM Kafka Linux MongoDB MyBatis MySQL Netty Nginx RabbitMQ消息中间件 Redis Spring SpringBoot SpringCloud SpringMVC Tomcat Zookeeper 四...
主要介绍了Java并发编程如何降低锁粒度并实现性能优化,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
几个月前我们介绍了如何通过Plumbr来进行线程锁检测,随后便收到了很多类似的问题,“Hi,文章写得不错,现在我终于知道是什么引发的性能问题了,但是现在我该怎么做?” 为了在我们的产品中集成这个解决方案,...
3.java同步的几种方式:synchronized,volatile,显示锁,原子变量,线程及对象的基础同步方法。 4.所谓线程安全就是当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在...