首页 > 编程语言 >Java 同步锁性能分析

Java 同步锁性能分析

时间:2024-09-08 23:23:44浏览次数:9  
标签:同步 Java Thread lock 性能 static threads new

同步锁在多线程编程中是保证线程安全的重要工具,其性能开销一直是不可忽视的存在。


(一)性能验证说明

为了直观说明我们可以直接先准备两个Java代码用例,我们通过高并发环境下的计数器递增操作来对比使用同步锁和不使用同步锁的性能差异。


1. 使用同步锁的代码示例

使用ReentrantLock来保护对共享资源(counter)的访问,确保同一时间只有一个线程可以对计数器进行操作。具体代码如下:


package org.zyf.javabasic.thread.lock.opti;

import java.util.concurrent.locks.ReentrantLock;

/**

* @program: zyfboot-javabasic

* @description: 使用了ReentrantLock来保护对共享资源(counter)的访问,确保同一时间只有一个线程可以对计数器进行操作。

* @author: zhangyanfeng

* @create: 2024-06-05 22:54

**/

public class SyncLockExample {

   private static int counter = 0;

   private static final ReentrantLock lock = new ReentrantLock();

   public static void main(String[] args) throws InterruptedException {

       long startTime = System.currentTimeMillis();

       Thread[] threads = new Thread[100];

       for (int i = 0; i < 100; i++) {

           threads[i] = new Thread(new IncrementWithLock());

           threads[i].start();

       }

       for (Thread thread : threads) {

           thread.join();

       }

       long endTime = System.currentTimeMillis();

       System.out.println("Time with lock: " + (endTime - startTime) + " ms");

   }

   static class IncrementWithLock implements Runnable {

       @Override

       public void run() {

           for (int i = 0; i < 1000000; i++) {

               lock.lock();

               try {

                   counter++;

               } finally {

                   lock.unlock();

               }

           }

       }

   }

}

2. 不使用同步锁的代码示例

不使用任何同步机制,直接操作共享资源。具体代码如下:


package org.zyf.javabasic.thread.lock.opti;

/**

* @program: zyfboot-javabasic

* @description: 不使用任何同步机制,直接操作共享资源。

* @author: zhangyanfeng

* @create: 2024-06-05 22:55

**/

public class NoSyncLockExample {

   private static int counter = 0;

   public static void main(String[] args) throws InterruptedException {

       long startTime = System.currentTimeMillis();

       Thread[] threads = new Thread[100];

       for (int i = 0; i < 100; i++) {

           threads[i] = new Thread(new IncrementWithoutLock());

           threads[i].start();

       }

       for (Thread thread : threads) {

           thread.join();

       }

       long endTime = System.currentTimeMillis();

       System.out.println("Time without lock: " + (endTime - startTime) + " ms");

   }

   static class IncrementWithoutLock implements Runnable {

       @Override

       public void run() {

           for (int i = 0; i < 1000000; i++) {

               counter++;

           }

       }

   }

}

3. 结果与讨论

运行以上代码,我当前的机器上可以直观的看到


使用同步锁的时间: 1314 ms

不使用同步锁的时间: 20 ms

从结果中可以明显看出,同步锁会带来显著的性能开销。同步锁的存在增加了线程间的等待时间和上下文切换的开销,从而降低了程序的整体运行效率。所以在使用锁时,对锁的优化使用是必不可少的。


标签:同步,Java,Thread,lock,性能,static,threads,new
From: https://blog.51cto.com/u_16270801/11953428

相关文章

  • Java 分级锁
    在JDK1.8中,synchronized关键字的性能得到了显著提升,这主要得益于JVM对锁机制进行了一系列优化:锁的分级及其优化路径(大体可以按照下面的路径进行升级:偏向锁—轻量级锁—重量级锁,锁只能升级,不能降级,所以一旦升级为重量级锁,就只能依靠操作系统进行调度)。要想了解锁升级的过......
  • Java的并发编程模型同步器
    在Java的并发编程中,同步器(Synchronizer)是一个非常重要的概念,它用于管理多个线程之间的协作,以确保线程间的正确交互和数据的一致性。Java并发包java.util.concurrent中提供了多种同步器,这些同步器主要用于实现锁(Locks)和其他并发原语(ConcurrencyPrimitives)。主要的同步器包括:......
  • 什么是 Java 虚拟机(JVM)?它的主要作用是什么?
    Java虚拟机(JavaVirtualMachine,简称JVM)是运行Java字节码的虚拟机。它是Java平台的一个核心部分,使得Java程序能够在任何安装了JVM的计算机上运行,而无需关心底层的操作系统或硬件差异。JVM为Java应用程序提供了一个安全、高效和可移植的执行环境。JVM的主要作......
  • 走向Java Server Page的第一个网页
    环境配置有关tomcat和jdk的环境配置在上一篇博客已经讲述,存在问题请查看上一篇。开发需求计算1到100的连续和,并将结果显示在一个带有样式的HTML页面中。当这个JSP页面被服务器处理时,Java代码会被执行,计算结果会被嵌入到HTML中,然后发送给客户端浏览器显示。代码实现首先使......
  • JavaScript高级——数据、变量、内存
    1、数据存储在内存中代表特定信息的东西,本质上是010101…….数据的特点:可传递、可运算一切皆数据内存中所有操作的目标:数据操作包括:算术运算、逻辑运算、赋值、运行函数(调用函数传参)。2、内存内存条通电后产生的可存储数据的空间(临时的)内存产生和死亡:内存条(电路板)——> ......
  • 值得收藏,2024最新Java学习线路图
    目录概述01.Java基础02.JavaWeb03.Java开发框架04.中间件&服务框架05.面试题精选06.项目实战原文:https://mp.weixin.qq.com/s/2KATrfgSOiMtg2IIcnI8Jg概述作为一个称职的Java程序员,谁能拒绝拥有一张学习线路图呢,有了学习线路图,让学习事半功倍。废话不多说,直接......
  • Java中的异步日志记录:Logback与AsyncAppender的配置与优化
    Java中的异步日志记录:Logback与AsyncAppender的配置与优化大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在Java应用中,日志记录是关键的功能,但同步日志记录可能会影响性能。为了解决这个问题,异步日志记录可以显著提高应用的响应速度。本文将详细介绍......
  • 【开源免费】基于SpringBoot+Vue.JS房屋租赁系统(JAVA毕业设计)
    本文项目编号T020,文末自助获取源码\color{red}{T020,文末自助获取源码}......
  • JAVA开源项目 学生心理咨询评估系统 计算机毕业设计
    本文项目编号T017,文末自助获取源码\color{red}{T017,文末自助获取源码}......
  • 在Java服务端实现策略模式:如何灵活应对业务逻辑的多变性
    在Java服务端实现策略模式:如何灵活应对业务逻辑的多变性大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在Java服务端开发中,业务逻辑的复杂性和多变性常常需要灵活的设计模式来应对。策略模式是一种经典的设计模式,用于定义一系列算法,将每一个算法封装......