用户锁,扣费模型,足够能支持一般并发
来源:互联网 发布:ubuntu安装非自由软件 编辑:程序博客网 时间:2024/04/29 21:59
足够能支持一般并发,高并发可在这基础上使用redis原子性
UserPrice.java
package com.andnnl.userlock;import java.util.Map;import java.util.concurrent.ConcurrentHashMap;/** * Created by andnnl on 2017/7/31. */public class UserPrice { private static UserPrice instance; private static Map<String, byte[]> lockMap = new ConcurrentHashMap<>(); private static Map<String, User> userMap = new ConcurrentHashMap<>(); private UserPrice() { } public synchronized static UserPrice getInstance(String uid) { if (instance == null) instance = new UserPrice(); byte[] b = lockMap.get(uid); if (b == null) { lockMap.put(uid, new byte[]{}); } return instance; } public boolean checkPrice(String uid, int price) { synchronized (lockMap.get(uid)) { User user = userMap.get(uid); if (user == null) { user = new User(uid, 100000000); userMap.put(uid, user); } if (user.price - price >= 0) { return true; } } return false; } public boolean deduct(String uid, int price) { synchronized (lockMap.get(uid)) { if (checkPrice(uid, price)) { User user = userMap.get(uid); user.price -= price; } } return false; } static void print() { for (Map.Entry<String, User> entry : userMap.entrySet()) { System.out.println(entry.getValue().toString()); } } public static void main(String[] args) { for (int i = 0; i < 300; i++) { final int finalI = i % 3; new Thread(new Runnable() { @Override public void run() { String uid = "uid" + finalI; UserPrice up = UserPrice.getInstance(uid); while (true) { if (up.checkPrice(uid, 3)) { up.deduct(uid, 3); } } } }).start(); } while (true) { try { Thread.currentThread().sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } print(); System.out.println(); } }}
User.java
package com.andnnl.userlock;/** * Created by andnnl on 2017/7/31. */public class User { String uid; int price; public User() { } public User(String uid, int price) { this.uid = uid; this.price = price; } public String getUid() { return uid; } public void setUid(String uid) { this.uid = uid; } public int getPrice() { return price; } public void setPrice(int price) { this.price = price; } @Override public String toString() { return "User{" + "uid='" + uid + '\'' + ", price=" + price + '}'; }}
阅读全文
0 0
- 用户锁,扣费模型,足够能支持一般并发
- SSH架构一般支持多少个并发?
- 预付费用户欠费
- 一个支持40万并发用户的即时通讯架构介绍
- 一个支持40万并发用户的即时通讯架构介绍
- 一个支持40万并发用户的即时通讯架构介绍
- 一个支持40万并发用户的即时通讯架构介绍
- 一个支持40万并发用户的即时通讯架构介绍
- Tomcat能够稳定支持的最大用户并发数
- Tomcat能够稳定支持的最大用户并发数
- Hive锁与并发模型
- 不得不引起足够重视的anonymous用户!
- 并发模型
- 并发模型
- 并发模型
- 并发模型
- 一般线性模型
- 并发1-并发模型
- 错排公式的理解
- android kotlin 学习网站 记录
- noi 14:求10000以内n的阶乘
- Anaconda装OpenCV
- PPPOE概述
- 用户锁,扣费模型,足够能支持一般并发
- c#正则匹配指定地址指定div内容
- webpack的模块化插件
- 17/7/31学习笔记03
- 基于React Native + redux 开发的客户端(适配IOS和Android),可查看保存妹纸,收藏分享文章等
- maven找不到依赖
- oracle 触发器简单应用
- 通用树的双亲表示法(代码演示))
- [CLI]tcpdump过滤小结