并发锁(一):为什么要加锁

简介: 并发锁(一):为什么要加锁

终于下定决心写这系列的文章了,这系列的文章将从零开始,一步步了解并发下,锁的产生,类别,以及锁的实现

并发数据混乱

首先我们看这样一段代码:

<?php
/**
 * Created by PhpStorm.
 * User: tioncico
 * Date: 19-7-8
 * Time: 下午8:31
 */
$num = file\_get\_contents('num.txt');
//记录每次访问的值
file\_put\_contents('./log.log',$num.PHP\_EOL,FILE\_APPEND);
echo $num.PHP_EOL;
file\_put\_contents('num.txt',$num+1);

这是一段逻辑很简单的代码,首先获取num.txt的数据,然后输出,再进行+1写入,运行如下:

image.png

这个道理很简单,只要运行了,自然就是+1,运行2次就是+2,那么,假如同时执行2次,是+2还是+1?同时执行3次?10次?100次呢?

我们通过ab进行压力测试,验证下:

首先,查看当前数字:

tioncico@tioncico-PC:~/PhpstormProjects/lock$ cat ./num.txt 
13

然后,进行并发访问:

tioncico@tioncico-PC:~/PhpstormProjects/lock$ ab -n10 -c10 http://x.cn/

得到结果:

tioncico@tioncico-PC:~/PhpstormProjects/lock$ cat ./num.txt 
22

很明显,理论上13+10=23,而这里却是22,查看日志可发现:

tioncico@tioncico-PC:~/PhpstormProjects/lock$ cat log.log 
13
14
14
15
16
17
18
19
20
21

可看到,有2次并发访问时,获得的数字是一样的,都是14,导致了两次14+1为15,第二次读取的数据明显有误,我们继续测试一遍,发现num.txt变成了1:

tioncico@tioncico-PC:~/PhpstormProjects/lock$ cat num.txt 
1tioncico@tioncico-PC:~/PhpstormProjects/lock$

查看log.log,发现:

image.png

在前面的时候,数据有很多重复,然后到35的时候,突然丢失了数据,变成了0+1,这是为什么呢?

1:在并发情况下,A客户端和B客户端同时请求,然后同时获得了相同的数据27,所以这2个进程同时获取到了27,又同时写入了28的这个数字,导致了数据重复读取,重复写入

2:在并发情况,A客户端和B客户端同时写入,如果是覆盖写入方式,可能会出现写入数据为空的情况,如果是追加写入,可能会出现数据冲突的情况

很明显,并发下,问题是一定有的,这个时候,该怎么解决呢?

并发下,同时访问数据会出现错误,那么,如果我不同时访问,当并发来的时候,同一时间只允许同一时间访问,这样问题不就没了?

这样是没错的,那该怎么限制呢?

这个时候,就需要用到  "锁"了

锁是一种数据保护机制,可允许某一个线程(进程)进行操作锁,当文件锁上时,其他线程(进程)根据锁的性质(读写锁,阻塞非阻塞)

其他进程会等待锁的进程操作结束,关闭锁,才可以操作该文件

目录
相关文章
|
XML 前端开发 Java
深入了解Spring MVC工作流程
深入了解Spring MVC工作流程
java regex 正则表达式 提取数字和去除数字,过滤数字,提取价格
java regex 正则表达式 提取数字和去除数字,过滤数字,提取价格
257 0
|
监控 网络协议 Java
Tomcat源码解析】整体架构组成及核心组件
Tomcat,原名Catalina,是一款优雅轻盈的Web服务器,自4.x版本起扩展了JSP、EL等功能,超越了单纯的Servlet容器范畴。Servlet是Sun公司为Java编程Web应用制定的规范,Tomcat作为Servlet容器,负责构建Request与Response对象,并执行业务逻辑。
Tomcat源码解析】整体架构组成及核心组件
|
数据采集 存储 数据可视化
Python数据分析:揭秘"黑神话:悟空"Steam用户评论趋势
Python数据分析:揭秘"黑神话:悟空"Steam用户评论趋势
|
设计模式 XML 存储
【二】设计模式~~~创建型模式~~~工厂方法模式(Java)
文章详细介绍了工厂方法模式(Factory Method Pattern),这是一种创建型设计模式,用于将对象的创建过程委托给多个工厂子类中的某一个,以实现对象创建的封装和扩展性。文章通过日志记录器的实例,展示了工厂方法模式的结构、角色、时序图、代码实现、优点、缺点以及适用环境,并探讨了如何通过配置文件和Java反射机制实现工厂的动态创建。
【二】设计模式~~~创建型模式~~~工厂方法模式(Java)
|
传感器 数据可视化 人机交互
虚拟现实(VR)与增强现实(AR)技术解析
【6月更文挑战第27天】 VR创造沉浸式虚拟环境,模拟真实感受,应用于旅游、医疗、教育和游戏。AR将虚拟信息叠加到现实,强调虚实结合与实时交互,常见于游戏、教育、购物和医疗。两者提供超越现实的体验,随着技术进步,将在更多领域发挥作用,开启新可能。
1068 1
|
Linux Go
[golang]使用gocron编写定时任务
[golang]使用gocron编写定时任务
534 0
|
SQL 数据库
sql数据库学习多久
SQL数据库学习的时间长度因个人基础、学习目标和投入时间而异。一般来说,可以分为以下几个阶段: 1. **入门阶段**:如果每天能够投入1\\~2小时的时间去学习并动手练习,通常一周可以达到入门
2404 0
|
供应链 安全 算法
艾瑞咨询最新研报:新迪天工CAD达到国际先进水平
三维CAD软件是最核心、最基础的工业软件之一,其数据模型是产品数字化的源头,已经成为了现代工程设计和制造必不可少的工具。