当前位置: 首页 > wzjs >正文

东莞家具行业营销型网站建设多少钱网站开发怎样建立后台数据

东莞家具行业营销型网站建设多少钱,网站开发怎样建立后台数据,杭州网站设计公司联系亿企邦,广东网广东网站建设演示synchronized锁机制用法的简单Demo。我们以"银行开户"场景为例:每个用户只能创建一个账户(模拟类似原代码中每个用户只能有一个私有空间的限制)。 第1步:创建项目结构 demo-lock ├── src/main/java/com/exampl…

演示synchronized锁机制用法的简单Demo。我们以"银行开户"场景为例:每个用户只能创建一个账户(模拟类似原代码中每个用户只能有一个私有空间的限制)。

第1步:创建项目结构

demo-lock
├── src/main/java/com/example/demo/
│   ├── controller/AccountController.java
│   ├── entity/Account.java
│   ├── mapper/AccountMapper.java
│   ├── service/AccountService.java
│   └── DemoApplication.java
└── src/main/resources/└── application.yml

第2步:添加依赖(pom.xml)

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3.1</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency>
</dependencies>

第3步:实体类 Account.java

@Data
@TableName("t_account")
public class Account {@TableId(type = IdType.AUTO)private Long id;private Long userId;private BigDecimal balance;
}

第4步:Mapper接口 AccountMapper.java

public interface AccountMapper extends BaseMapper<Account> {
}

第5步:Service层 AccountService.java

@Service
@RequiredArgsConstructor
public class AccountService {private final AccountMapper accountMapper;// 无锁版本(存在并发问题)public void createAccountUnsafe(Long userId) {Long count = accountMapper.selectCount(new QueryWrapper<Account>().eq("user_id", userId));if (count > 0) {throw new RuntimeException("用户已存在账户");}Account account = new Account();account.setUserId(userId);account.setBalance(BigDecimal.ZERO);accountMapper.insert(account);}// 有锁版本(线程安全)public void createAccountWithLock(Long userId) {String lockKey = String.valueOf(userId).intern();synchronized (lockKey) {createAccountUnsafe(userId);}}
}

第6步:Controller层 AccountController.java

@RestController
@RequiredArgsConstructor
public class AccountController {private final AccountService accountService;// 不安全的开户接口(用于演示并发问题)@GetMapping("/unsafe/{userId}")public String unsafeCreate(@PathVariable Long userId) {try {accountService.createAccountUnsafe(userId);return "开户成功";} catch (Exception e) {return e.getMessage();}}// 安全的开户接口(使用synchronized锁)@GetMapping("/safe/{userId}")public String safeCreate(@PathVariable Long userId) {try {accountService.createAccountWithLock(userId);return "开户成功";} catch (Exception e) {return e.getMessage();}}
}

第7步:配置文件 application.yml

spring:datasource:url: jdbc:mysql://localhost:3306/demo?useSSL=false&characterEncoding=utf8username: rootpassword: your_passwordmybatis-plus:configuration:map-underscore-to-camel-case: true

第8步:测试步骤

  1. 初始化数据库
CREATE DATABASE IF NOT EXISTS demo;
USE demo;CREATE TABLE t_account (id BIGINT PRIMARY KEY AUTO_INCREMENT,user_id BIGINT NOT NULL UNIQUE,balance DECIMAL(10,2) NOT NULL DEFAULT 0
);
  1. 启动应用
mvn spring-boot:run
  1. 并发测试(使用JMeter或Postman)

测试不安全接口

  • 用多个线程同时调用 GET http://localhost:8080/unsafe/123
  • 可能结果:成功创建多个账户(违反唯一约束)

测试安全接口

  • 用多个线程同时调用 GET http://localhost:8080/safe/456
  • 结果:只会有第一个请求成功创建账户

关键代码解释

  1. 锁对象的选择
String lockKey = String.valueOf(userId).intern();
  • intern()保证相同userId值返回同一个String对象(来自字符串常量池)
  • 不同userId对应的锁对象不同,实现细粒度锁
  1. 同步代码块
synchronized (lockKey) {// 临界区代码
}
  • 确保同一用户的并发请求串行执行
  • 不同用户的请求可以并行处理

典型输出对比

无锁接口测试结果

第一次请求:开户成功(创建账户)
第二次请求:Duplicate entry '123' for key 'user_id'(违反唯一约束)

有锁接口测试结果

第一次请求:开户成功(创建账户)
后续所有请求:用户已存在账户(业务校验拦截)

总结说明表格

关键点说明
synchronized范围基于用户ID的细粒度锁,不影响其他用户操作
String.intern()保证相同userid得到的String是同一个对象(来自字符串常量池)
事务边界在锁范围内包含整个事务操作(确保查询和插入操作的原子性)
性能影响只对相同用户的并发请求串行化处理,不影响不同用户的并发处理
适用场景需要基于特定维度(如用户ID)进行并发控制的场景

可以通过这个Demo逐步体验:

  1. 先观察不加锁时的并发问题
  2. 再体验加锁后的线程安全效果
  3. 最后尝试调整userId观察不同用户的并发情况

Jmeter测试

  1. 设置 HTTP 请求
    在这里插入图片描述

  2. 设置线程组
    在这里插入图片描述

  3. 添加 查看结果树
    在这里插入图片描述

  4. 运行
    在这里插入图片描述


文章转载自:

http://dE0A6kZQ.qcwck.cn
http://ACC3pBhk.qcwck.cn
http://vGoskDZH.qcwck.cn
http://lYS7Wrhc.qcwck.cn
http://xztDGYY7.qcwck.cn
http://K6CiYctE.qcwck.cn
http://wzRgNdEN.qcwck.cn
http://BkFgrv3U.qcwck.cn
http://QXwELrBr.qcwck.cn
http://pHSnEIKB.qcwck.cn
http://l1LDMd3U.qcwck.cn
http://C5OFwGXI.qcwck.cn
http://yoaPGjWM.qcwck.cn
http://tnfD55If.qcwck.cn
http://p7EiZ7qc.qcwck.cn
http://5Cen7ov2.qcwck.cn
http://38BgNQqw.qcwck.cn
http://Y7gSKaIA.qcwck.cn
http://LS4EpHrp.qcwck.cn
http://c8quYjZc.qcwck.cn
http://S1svZYHQ.qcwck.cn
http://X1BN69Ol.qcwck.cn
http://HXlSJDvE.qcwck.cn
http://JBnVKXWS.qcwck.cn
http://YvUVmiJT.qcwck.cn
http://tnevCH9u.qcwck.cn
http://65J2mX9l.qcwck.cn
http://I6Og8rhR.qcwck.cn
http://CAjjgFTV.qcwck.cn
http://ft5OkYXP.qcwck.cn
http://www.dtcms.com/wzjs/611596.html

相关文章:

  • 微信公众号和微网站wordpress用户可以互加好友
  • 版式设计图片郑州seo网站排名优化公司
  • 手机 做网站wordpress入站密码
  • 做网站设计的都转行干啥了成都旅游景点攻略
  • 分销系统网站湖南网站备案要多少天
  • 网站免费正能量直接进入在线软文投稿平台有哪些
  • 怎么做免费的网站商城百度一下百度一下百度一下
  • 成都免费建网站机关单位网站建设工作方案
  • 如何做企业网站做网站需要先买域名吗
  • 学校网站建设需要注意什么房产交易中心官网
  • 企业网站主页 优帮云温州企业模板建站
  • 西安网站优化公司wordpress如何接入h5
  • 网站建设概括门户网站建设的重要作用
  • 新闻类的网站如何做优化、石家庄建筑网
  • 兰州网站备案谁家做沙漠风网站建设6
  • 网站 后台 安装如何做阿里巴巴国际网站
  • 网站网站制作wordpress 获取 图片说明
  • 免费源码下载网站云南网站建设专业品牌
  • 建个注册页面网站酒店宣传推广方案
  • 手机影视网站制作合同协议模板
  • 免费.net网站空间綦江网站
  • 微信小程序开发网站建设中英文双语网站 滑动切换
  • 付费网站 源码 下载链接沈阳个人网站制作
  • 网站开发女生适合吗买个域名
  • 网站怎么做评论网络规划设计师怎么报名
  • 开封市网站建设公司中国网站排行榜前100名
  • 做网站遇到的困难总结丹东供求园
  • php网站开发最低配置wordpress定制主题
  • 网站转移空间以后ip会变化吗工作组赴沈阳爆炸现场
  • 嘉兴网站开发与制作如何制作一个报名微信小程序