JAVA- 锁机制介绍 进程锁

news2025/4/25 13:20:12

进程锁

  • 基于文件的锁
  • 基于Socket的锁
  • 数据库锁
  • 分布式锁
    • 基于Redis的分布式锁
    • 基于ZooKeeper的分布式锁

实际工作中都是集群部署,通过负载均衡多台服务器工作,所以存在多个进程并发执行情况,而在每台服务器中又存在多个线程并发的情况,所以在java中锁分为 进程锁和线程锁,本文是对进程锁介绍,进程锁常见如下

基于文件的锁

基于文件的锁(FileLock):多个进程共同访问某个文件,通过锁定一个文件来实现跨进程的互斥
示例代码

public class FileLockExample {
    public static void main(String[] args) {
        try (RandomAccessFile file = new RandomAccessFile("lockfile.lck", "rw");
             FileChannel channel = file.getChannel()) {
            
            // 尝试获取独占文件锁(阻塞直到获取成功)
            FileLock lock = channel.lock();
            try {
                System.out.println("进程获取到文件锁,开始执行临界区操作...");
                Thread.sleep(5000); // 模拟耗时操作
            } finally {
                lock.release();
                System.out.println("进程释放文件锁");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

优点:简单,无需额外依赖。
缺点:文件锁依赖文件系统,不同操作系统可能表现不同;需确保文件路径一致获取字节编码一致,比如windows系统和mac系统默认的字节编码格式就不同

基于Socket的锁

通过绑定端口实现单机进程互斥(不推荐,仅作演示)。
示例代码

import java.net.ServerSocket;

public class PortBasedLockExample {
    private static final int LOCK_PORT = 12345;

    public static void main(String[] args) {
        try (ServerSocket serverSocket = new ServerSocket(LOCK_PORT)) {
            System.out.println("进程获取到端口锁,开始执行临界区操作...");
            Thread.sleep(5000); // 模拟耗时操作
        } catch (Exception e) {
            System.out.println("端口已被占用,其他进程正在运行");
        }
    }
}

优点:无需额外依赖。
缺点:不可靠,易受端口冲突影响;不适用于分布式环境。

数据库锁

多台服务器但是一般是用一个数据库的数据源,通过数据库的行锁或事务实现进程间的互斥。
示例代码(MySQL行锁)

public class DatabaseLockExample {
    private static final String DB_URL = "jdbc:mysql://localhost:3306/mydb";
    private static final String USER = "root";
    private static final String PASS = "password";

    public static void main(String[] args) {
        try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS)) {
            // 开启事务并锁定某一行
            conn.setAutoCommit(false);
            PreparedStatement stmt = conn.prepareStatement(
                "SELECT * FROM locks WHERE lock_name = 'my_lock' FOR UPDATE"
            );
            ResultSet rs = stmt.executeQuery();
            
            if (rs.next()) {
                System.out.println("进程获取到数据库锁,开始执行临界区操作...");
                Thread.sleep(5000); // 模拟耗时操作
            }
            
            conn.commit(); // 提交事务后释放锁
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

优点:适用于分布式环境。
缺点:依赖数据库,需处理连接池和事务超时。

分布式锁

基于Redis的分布式锁

外部协调服务,使用Redis的SETNX命令或RedLock算法实现跨进程锁。
示例代码(Jedis实现)

import redis.clients.jedis.Jedis;
import redis.clients.jedis.params.SetParams;

public class RedisLockExample {
    private static final String LOCK_KEY = "my_distributed_lock";
    private static final String LOCK_VALUE = "locked";
    private static final int LOCK_EXPIRE = 30000; // 锁超时时间(毫秒)

    public static void main(String[] args) {
        Jedis jedis = new Jedis("localhost", 6379);
        try {
            // 尝试获取锁(SETNX + 超时时间)
            String result = jedis.set(LOCK_KEY, LOCK_VALUE, 
                SetParams.setParams().nx().px(LOCK_EXPIRE));
            
            if ("OK".equals(result)) {
                System.out.println("进程获取到Redis锁,开始执行临界区操作...");
                Thread.sleep(5000); // 模拟耗时操作
            } else {
                System.out.println("获取锁失败,其他进程正在运行");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 释放锁(需使用Lua脚本确保原子性)
            String script = "if redis.call('get', KEYS[1]) == ARGV[1] then " +
                            "return redis.call('del', KEYS[1]) else return 0 end";
            jedis.eval(script, 1, LOCK_KEY, LOCK_VALUE);
            jedis.close();
        }
    }
}

优点:高性能,适用于分布式系统。
缺点:需处理锁续期、网络分区等问题(推荐使用Redisson库)。

基于ZooKeeper的分布式锁

外部协调服务,利用ZooKeeper的临时有序节点实现进程间协调。
示例代码(Curator框架)

import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.locks.InterProcessMutex;
import org.apache.curator.retry.ExponentialBackoffRetry;

public class ZooKeeperLockExample {
    private static final String ZK_ADDRESS = "localhost:2181";
    private static final String LOCK_PATH = "/my_distributed_lock";

    public static void main(String[] args) {
        CuratorFramework client = CuratorFrameworkFactory.newClient(
            ZK_ADDRESS, new ExponentialBackoffRetry(1000, 3));
        client.start();
        
        InterProcessMutex lock = new InterProcessMutex(client, LOCK_PATH);
        try {
            if (lock.acquire(10, java.util.concurrent.TimeUnit.SECONDS)) {
                System.out.println("进程获取到ZooKeeper锁,开始执行临界区操作...");
                Thread.sleep(5000); // 模拟耗时操作
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                lock.release();
            } catch (Exception e) {
                e.printStackTrace();
            }
            client.close();
        }
    }
}

优点:高可靠性,自动处理节点失效。
缺点:依赖ZooKeeper集群,性能低于Redis。

总结
在这里插入图片描述
根据具体场景选择合适的进程锁方案,分布式环境下推荐使用 Redis 或 ZooKeeper 实现!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2326626.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java Spring Boot 与前端结合打造图书管理系统:技术剖析与实现

目录 运行展示引言系统整体架构后端技术实现后端代码文件前端代码文件1. 项目启动与配置2. 实体类设计3. 控制器设计4. 异常处理 前端技术实现1. 页面布局与样式2. 交互逻辑 系统功能亮点1. 分页功能2. 搜索与筛选功能3. 图书操作功能 总结 运行展示 引言 本文将详细剖析一个基…

深入剖析JavaScript多态:从原理到高性能实践

摘要 JavaScript多态作为面向对象编程的核心特性,在动态类型系统的支持下展现了独特的实现范式。本文深入解析多态的三大实现路径:参数多态、子类型多态与鸭子类型,详细揭示它们在动态类型系统中的理论基础与实践意义。结合V8引擎的优化机制…

GalTransl开源程序支持GPT-4/Claude/Deepseek/Sakura等大语言模型的Galgame自动化翻译解决方案

一、软件介绍 文末提供程序和源码下载 GalTransl是一套将数个基础功能上的微小创新与对GPT提示工程(Prompt Engineering)的深度利用相结合的Galgame自动化翻译工具,用于制作内嵌式翻译补丁。支持GPT-4/Claude/Deepseek/Sakura等大语言模型的…

TGES 2024 | 基于空间先验融合的任意尺度高光谱图像超分辨率

Arbitrary-Scale Hyperspectral Image Super-Resolution From a Fusion Perspective With Spatial Priors TGES 2024 10.1109/TGRS.2024.3481041 摘要:高分辨率高光谱图像(HR-HSI)在遥感应用中起着至关重要的作用。单HSI超分辨率&#xff…

算法基础_基础算法【高精度 + 前缀和 + 差分 + 双指针】

算法基础_基础算法【高精度 前缀和 差分 双指针】 ---------------高精度---------------791.高精度加法题目介绍方法一:代码片段解释片段一: 解题思路分析 792. 高精度减法题目介绍方法一:代码片段解释片段一: 解题思路分析 7…

Python数据类型-list

列表(List)是Python中最常用的数据类型之一,它是一个有序、可变的元素集合。 1. 列表基础 创建列表 empty_list [] # 空列表 numbers [1, 2, 3, 4, 5] # 数字列表 fruits [apple, banana, orange] # 字符串列表 mixed [1, hello, 3.14, True] # 混合类型…

如何使用cpp操作香橙派GPIO --使用<wiringPi.h>

香橙派是国产SBC ,对标树莓派。不过国内的开发环境确实挺惨的,没多少帖子讨论。楼主决定从今天起,不定期更新香橙派的教程。 今天的教程是如何使用香橙派下载wiringOP 并使用CPP操作GPIO 操作GPIO 下载wiringPi 检查git 版本克隆wiringPi…

nacos-sdk-go v2.29 中一个拼写错误,我定位了3个小时 ……

文章目录 问题背景问题现象问题定位解决方案经验总结 问题背景 今天在给项目增加服务注册和发现功能时,选择了 nacos 作为服务注册中心。在使用 nacos-sdk-go v2.29 版本进行开发时,遇到了一个令人啼笑皆非的问题,足足花了3个小时才找到原因。 问题现象 在实现服务订阅通知功…

Linux中的文件寻址

Linux的层级结构 在Linux中一切皆文件 其中 要注意在命令行中看实际选择写哪一种路径 相对路径 绝对路径名称的简写,省略了用户当前所在的系统位置此名称只有在管理当前所在系统目录中子文件时才能使用系统中不以/开有的文件名称都为相对路径在程序操作时会自动…

静态时序分析:时钟标记(作为数据使用的时钟)及其分析方式

相关阅读 静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html?spm1001.2014.3001.5482 引言 一般情况下,设计中的时钟路径和数据路径是严格区分开的:时钟路径即从时钟源对象(时钟定义点)到触发器的时钟…

AI学习记录-QWQ32b太强了

业务理解能力爆表,指令遵循能力极强,才32b成本极低,大量的公司的项目可以嵌入到自己的项目当中了,再fineture一下,以后不上AI的系统都卖不出去了。 试验1 输出 试验2: 输出

STM32 FATFS - 在spi的SD卡中运行fatfs

参考文章 STM32 CubeMX 硬件SPI SD卡 FATFS_stm32cubemx fatfs-CSDN博客 例程地址:STM32FatFS: 基于stm32的fatfs例程,配合博客文章 基于野火STM32MINI开发板 STM32配置 系统模式配置 输出串口配置 SPI配置 使用全双工模式,禁用硬件…

FreeCAD傻瓜教程-装配体Assembly的详细使用过程

源起: 看了官方的教程说明,感觉太过简单,好多细节没有体现,且该部分的翻译还没有。这里是做个记录,对使用过程中的细节进行图文说明,以方便真正的新手能够快速应用,制作出自己的零件&#xff0c…

数字电子技术基础(三十七)——利用Multisim软件实现16线-4线编码器和4线-16线译码器

1 利用Multisim软件来实现16线-4线编码器 在之前的博客中完成了利用Multisim软件实现8线-3线优先编码器,现在使用Multisim软件来实现16线-4线编码器,其原理图如下所示: 使用字发生器来实现16线-4线编码器,器件选择: …

02_MySQL安装及配置

文章目录 一、下载二、安装及配置2.1、选择安装类型2.2、检查需要的依赖2.3、安装2.4、配置2.4.1、配置类型和网络2.4.2、配置账户和角色2.4.3、配置Windows服务2.4.4、让配置生效 2.5、验证是否安装成功 三、卸载3.1、运行MySQL安装工具3.2、卸载及清理3.3、卸载之后的检查工作…

Windows11,微软软件(VSCODE/EDG)错误登录,0x80190001错误

修改网络设置 运行以下命令,打开网络共享中心 Start-Process "control.exe" -ArgumentList "/name Microsoft.NetworkAndSharingCenter" 点击左下角的 选项 TLS 1.1 1.2 1.3 这三个选项 1.0 不建议启用,不安全 1.1 可以不用启用…

力扣刷题-热题100题-第29题(c++、python)

19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode)https://leetcode.cn/problems/remove-nth-node-from-end-of-list/description/?envTypestudy-plan-v2&envIdtop-100-liked 计算链表长度 对于链表,难的就是不知道有多少元素&#xff…

阻止上传可执行程序

点击工具中的文件服务器资源管理器 、然后点击文件屏蔽管理中的文件屏蔽,然后导入目标文件选择要限制的属性即可

DirectX修复工具免费版下载安装教程(附安装包)

文章目录 前言一、DirectX修复工具免费版介绍二、DirectX修复工具免费版安装教程1. 下载安装包2. 解压文件3. 以管理员身份运行4. 开始检测与修复5. 查看修复详情 前言 本教程主要介绍的是DirectX修复工具免费版下载安装教程,帮您轻松解决 DirectX 相关问题。 一、…

UE5学习笔记 FPS游戏制作33 游戏保存

文章目录 核心思想创建数据对象创建UIUI参数和方法打开UI存档文件的位置可以保存的数据类型 核心思想 UE自己有保存游戏的功能,核心节点,类似于json操作,需要一个数据类的对象来进行保存和读取 创建存档 加载存档 保存存档 创建数据对象…