首页 > 其他分享 >使用同步锁的代码示例7

使用同步锁的代码示例7

时间:2024-09-06 17:22:52浏览次数:11  
标签:同步 Thread 示例 lock 代码 System static threads new

使用同步锁的代码示例

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();
                }
            }
        }
    }
}

不使用同步锁的代码示例

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++;
            }
        }
    }
}

结果与讨论

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

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

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/xiaofeng10330111/article/details/139611703

标签:同步,Thread,示例,lock,代码,System,static,threads,new
From: https://blog.csdn.net/2401_86609655/article/details/141828343

相关文章

  • 三分钟全面了解低代码,两小时实现应用系统搭建
    在数字化转型的浪潮中,企业对于快速开发和部署应用系统的需求日益增长。传统的软件开发方法往往耗时且成本高昂,而低代码开发平台的出现,为解决这一问题提供了全新的视角。本文将带你三分钟全面了解低代码开发,并在两小时内实现一个简单的应用系统搭建。低代码开发简介低代码开......
  • 企业数智化转型实战:JNPF低代码平台的创新应用案例
    随着信息技术的飞速发展,企业数智化转型已成为推动企业持续增长和提升竞争力的关键战略。在这一过程中,低代码平台因其快速开发、高效部署和易于维护的特性,成为企业数字化转型的重要工具。本文将探讨JNPF低代码平台在企业数智化转型中的创新应用案例。JNPF低代码平台简介JNPF......
  • 搜索算法之二分搜索详细解读(附带Java代码解读)
    1.基本概念二分搜索(BinarySearch)是一种高效的查找算法,用于在一个已排序的数组中查找特定元素。它通过逐步将搜索范围减少一半来实现搜索,从而比线性搜索更快。由于它利用了数组的有序性,能够在对数时间内完成搜索操作。2.工作原理二分搜索的基本思想是:初始化:设置两个指针......
  • 最新微信商城小程序源码搭建指南(附源代码)
     一、前期准备 1.1了解微信商城小程序 微信商城小程序是在微信平台上运行的商城系统,主要形式分为展示型和下单+展示型。展示型主要用于商品信息的展示,不支持在线下单;而下单+展示型则支持在线下单、购物车、订单管理等完整电商功能。 1.2注册与认证 源码及演示:xcxym......
  • 如何用大语言模型分析开源代码?
    要使用大语言模型(如GPT)分析开源代码,比如HyperScan正则开源代码,可以按照以下步骤进行:1.获取代码库首先,需要从开源平台(如GitHub)下载HyperScan的代码库。你可以使用Git命令克隆代码库:gitclonehttps://github.com/intel/hyperscan.git2.分块处理代码由于大语言模型在一次请求中只能......
  • 例 2.38 数据写入文件示例
    2.38.1点击查看代码importpandasaspdimportnumpyasnpdates=pd.date_range(start='20191101',end='20191124',freq='D')a1=pd.DataFrame(np.random.randn(24,4),index=dates,columns=list('ABCD'))a2=pd.DataFrame(np.rand......
  • 服务器时间同步
    一、安装ntpddate#centos,redhat系列yuminstallntpdate#debian,ubuntu系列aptinstallntpdate二、在服务器都能联网情况下时间同步#手动同步阿里云时间服务器时间ntpdatentp.aliyun.com阿里云时间同步地址ntp1.aliyun.comntp2.aliyun.comntp3.aliyun.comntp4.......
  • git 提交代码命令
    git命令gitaddfiles添加修改的文件到暂存区gitcommit-m"备注"   提交代码gitpull拉取他人代码(防止代码提交上去之后把别人的代码覆盖了)如果与他人的代码有冲突了解决冲突,保留需要的代码再提交gitpush将代码推送origin上gitbranch  XXX  创建XXX分......
  • 机器学习、生成式AI和深度学习时间序列模型(含代码)
    作者:老余捞鱼原创不易,转载请标明出处及原作者。写在前面的话:    本文转自一篇论文,主要讨论了在不同行业中时间序列预测的重要性,以及如何利用机器学习、生成式人工智能(GenerativeAI)和深度学习来提高预测的准确性。时间序列数据是按特定时间间隔收集或记录的数据点......
  • FP7209:非同步升压恒流LED区动IC
    前言:LED驱动芯片是什么?LED驱动器(LEDDriver),是指驱动LED发光或LED模块组件正常工作的电源调整电子器件。由于LEDPN结的导通特性决定,它能适应的电源电压和电流变动范围十分狭窄,稍许偏离就可能无法点亮LED或者发光效率严重降低,或者缩短使用寿命甚至烧毁芯片。现行的工频电源和常......