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

使用同步锁的代码示例26

时间:2024-09-03 12:52:04浏览次数:13  
标签:26 同步 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

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

相关文章

  • 使用同步锁的代码示例30
    使用同步锁的代码示例packageorg.zyf.javabasic.thread.lock.opti;importjava.util.concurrent.locks.ReentrantLock;/***@program:zyfboot-javabasic*@description:使用了ReentrantLock来保护对共享资源(counter)的访问,确保同一时间只有一个线程可以对计数器......
  • 26. shell当中函数返回值,返回值的作用,退出码状态,得到函数处理结果
    函数返回值作用在其他编程语言中,返回值是指函数被调用之后,执行函数体中的代码所得到的结果,这个结果可通过return语句返回。但Shell中返回值表示的是函数的退出状态:返回值0表示函数执行成功,非0表示函数执行失败。if、while、for等语句都是根据函数的退出状态来判断条件是否......
  • 【路径规划】在二维环境中快速探索随机树和路径规划的示例
    摘要本文介绍了快速探索随机树(Rapidly-exploringRandomTree,RRT)算法在二维环境中的路径规划应用。RRT是一种随机采样算法,能够快速构建从起点到目标点的路径,特别适用于复杂环境中的机器人路径规划。通过在随机方向上扩展树结构,RRT算法能够高效避开障碍物并找到一条可行路径......
  • 在Java中23种设计模式,分类以及代码示例
    在Java中23种设计模式,分类以及代码示例在Java中,设计模式可以分为23种,以三个不同的分类进行划分。1.创建型模式(CreationalPatterns):单例模式(Singleton)原型模式(Prototype)工厂方法模式(FactoryMethod)抽象工厂模式(AbstractFactory)建造者模式(Builder)2.结构型模式(Structura......
  • 告别数据孤岛:数据增量同步方案助力企业数据整合!
    为了更高效、更经济地管理和传输数据,特别是在数据量大、更新频繁的环境中,企业需要通过数据增量同步方案来解决。数据增量同步方案是一种数据同步技术,只同步自上次同步以来发生变化的部分数据,而不是同步整个数据集。具有以下作用:1.减少数据传输量:在文件同步过程中,如果只同步发生......
  • 基于SpringBoot的宠物摄影网站管理系统+LW参考示例
    免费分享全阶段全种类学习资源,内涵少儿、小学、初中、高中、大学、专升本、考研、四六级、建造师、法考、网赚技巧、毕业设计等,持续更新,敬请关注~**文章目录1.项目介绍2.项目部署3.项目部分截图4.获取方式1.项目介绍技术栈+工具:SpringBoot+MySQL+Maven+IDEA......
  • 基于SSM的洗衣房管理系统+原生微信小程序+LW参考示例
    免费分享全阶段全种类学习资源,内涵少儿、小学、初中、高中、大学、专升本、考研、四六级、建造师、法考、网赚技巧、毕业设计等,持续更新,敬请关注~文章目录1.项目介绍2.项目部署2.1后端2.2小程序端3.项目部分截图4.获取方式1.项目介绍技术栈+工具:SSM+JSP+......
  • Vue2 - 最新实现百度地图3D立体感视角教程及示例代码,利用WebGL实现3d百度地图详细流程
    前言如果您需要Vue3版本,请访问在vue2|nuxt2项目开发中,详解实现“安装引入百度地图webgl技术,实现3d地图教程”将百度地图变成3D视角效果,让百度地图平面2D视图和3D立体视图进行切换渲染显示,vue如何实现百度地图的三维立体地图效果,解决WebGL引入报错或无效、3D地图......
  • 26. 在集合中删除元素时,为什么使用Iterator.remove()而不是Collection.remove()?
    在遍历集合时,推荐使用Iterator.remove()方法来删除元素,而不是Collection.remove()方法。这主要是出于以下几个原因:1.避免ConcurrentModificationExceptionIterator.remove():在使用Iterator遍历集合时,Iterator会跟踪集合的结构性修改(即增加或删除元素)。Iterator.remove(......
  • C#/.NET/.NET Core技术前沿周刊 | 第 3 期(2024年8.26-8.31)
    前言C#/.NET/.NETCore技术前沿周刊,你的每周技术指南针!记录、追踪C#/.NET/.NETCore领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿,助力技术成长与视野拓宽。欢迎投稿,推荐或自荐优质文章/项目/学习资源等。每周一定期发......