- 浏览: 261459 次
- 性别:
- 来自: 天津
文章分类
- 全部博客 (183)
- oracle (4)
- informix (1)
- web开发 (6)
- java (49)
- hibernate (1)
- hadoop (1)
- spring (23)
- 非技术 (8)
- ibatis2 (5)
- Linux (6)
- tomcat (14)
- nginx (7)
- dubbo (3)
- myibatis (7)
- webservice 开发 (2)
- mysql (2)
- svn (2)
- redis (7)
- 分布式技术 (17)
- zookeeper (2)
- kafka (2)
- velocity (1)
- maven (7)
- js (1)
- freemarker (1)
- Thymeleaf (3)
- 代码审计 (1)
- ibatis3 (1)
- rabbitmq (1)
最新评论
package org;
import java.util.Random;
public class MockMain {
//交易总金额
public static int money =0;
public static void main(String[] args) {
//模拟多线程,
for(int i=0;i<5;i++){
new Thread(new Runnable() {
public void run() {
//商品金额
money = new Random().nextInt(500);
System.out.println("main 线程id:"+Thread.currentThread().getId()
+";商品金额:"+MockMain.money);
//检查账号金额是否大于商品金额
AccountMoney account = new AccountMoney();
account.check();
//扣款
LoseMoney lose = new LoseMoney();
lose.outMoney();
}
}).start();
}
}
}
package org;
public class AccountMoney {
public void check(){
System.out.println("线程id:"+Thread.currentThread().getId()
+";商品金额:"+MockMain.money);
}
}
package org;
public class LoseMoney {
public void outMoney(){
System.out.println("线程id:"+Thread.currentThread().getId()
+";扣款金额:"+MockMain.money);
}
}
输出日志:
main 线程id:10;商品金额:141
main 线程id:9;商品金额:130
main 线程id:11;商品金额:51
main 线程id:12;商品金额:51
线程id:10;商品金额:51
线程id:8;商品金额:51
线程id:12;商品金额:51
线程id:9;商品金额:51
线程id:11;商品金额:51
线程id:12;扣款金额:51
线程id:11;扣款金额:51
线程id:8;扣款金额:51
线程id:10;扣款金额:51
线程id:9;扣款金额:51
从日志中可以看出,线程中检查的金额 ,扣除的金额是不对的。 线程10 的商品金额应该为:141,但是检查和扣除是变成了51; 线程9 的商品金额应该为:130,但是检查和扣除是变成了51 . 线程还没有工作完毕,就被其它的线程打断了,可以考虑加锁看看是否解决 线程和金额混乱的问题。对MockMain 进行修改,修改后如下:
package org;
import java.util.Random;
public class MockMain {
public static final Integer lock =1;
//交易总金额
public static int money =0;
public static void main(String[] args) {
//模拟多线程,
for(int i=0;i<5;i++){
new Thread(new Runnable() {
public void run() {
synchronized (lock) {
//商品金额
money = new Random().nextInt(500);
System.out.println("main 线程id:"+Thread.currentThread().getId()
+";商品金额:"+MockMain.money);
//检查账号金额是否大于商品金额
AccountMoney account = new AccountMoney();
account.check();
//扣款
LoseMoney lose = new LoseMoney();
lose.outMoney();
}
}
}).start();
}
}
}
输出日志:
main 线程id:8;商品金额:439
线程id:8;商品金额:439
线程id:8;扣款金额:439
main 线程id:12;商品金额:172
线程id:12;商品金额:172
线程id:12;扣款金额:172
main 线程id:11;商品金额:300
线程id:11;商品金额:300
线程id:11;扣款金额:300
main 线程id:10;商品金额:128
线程id:10;商品金额:128
线程id:10;扣款金额:128
main 线程id:9;商品金额:459
线程id:9;商品金额:459
线程id:9;扣款金额:459
从日志看,已经可以实现了线程和金额的同步,但是我们添加了锁效率会很低,只有一个线程执行完成后,下一个线程才会执行。有没有更高的效率来实现呢。
我们可以变量和线程绑定试一下。代码修改如下:
package org;
import java.util.Random;
public class MockMain {
public static final Integer lock =1;
public static ThreadLocal<Integer> moneyStore = new ThreadLocal<Integer>();
public static void main(String[] args) {
//模拟多线程,
for(int i=0;i<5;i++){
new Thread(new Runnable() {
public void run() {
//商品金额
Integer money = new Random().nextInt(500);
//变量和线程绑定
moneyStore.set(money);
System.out.println("main 线程id:"+Thread.currentThread().getId()
+";商品金额:"+money +"; moneyStore="+moneyStore.get());
//检查账号金额是否大于商品金额
AccountMoney account = new AccountMoney();
account.check();
//扣款
LoseMoney lose = new LoseMoney();
lose.outMoney();
}
}).start();
}
}
}
package org;
public class AccountMoney {
public void check(){
System.out.println("线程id:"+Thread.currentThread().getId()
+";商品金额:"+MockMain.moneyStore.get());
}
}
package org;
public class LoseMoney {
public void outMoney(){
System.out.println("线程id:"+Thread.currentThread().getId()
+";扣款金额:"+MockMain.moneyStore.get());
}
}
日志输出:
main 线程id:10;商品金额:320; moneyStore=320
main 线程id:11;商品金额:252; moneyStore=252
main 线程id:8;商品金额:116; moneyStore=116
main 线程id:12;商品金额:56; moneyStore=56
线程id:11;商品金额:252
线程id:12;商品金额:56
线程id:10;商品金额:320
线程id:9;商品金额:468
线程id:8;商品金额:116
线程id:11;扣款金额:252
线程id:10;扣款金额:320
线程id:9;扣款金额:468
线程id:8;扣款金额:116
线程id:12;扣款金额:56
从日志看,线程是并发的,是同时进行的,金额和线程没有混乱,因为没有使用锁,并发效率很高。
因此,使用这种方法实现高并发是安全可靠的。
- 高并发隔离.zip (17.1 KB)
- 下载次数: 0
发表评论
-
aop实现通用缓存,并且防止缓存击穿
2019-09-16 15:10 698实现代码在附件中 1.自定义注解文件 package sgn ... -
统计多线程下程序运行总时间
2019-05-15 16:55 1027package com.gpcsoft.hct.epp.egp ... -
通过模板的方式解决缓存被击穿的问题
2019-04-15 11:35 3741. package gjp.tools; import c ... -
Rsa 加解密算法
2019-03-18 10:27 324package gjp.tools; /** * @Aut ... -
httpClient 使用http协议上传文件
2018-10-09 15:58 3055<dependency> <grou ... -
httpClient 使用HTTPS 协议上传文件
2018-09-30 14:50 2356<dependency> <group ... -
防止 XML外部实体注入
2018-09-18 17:03 7068方式一 DocumentBuilderFactory dbf ... -
httpClient 的https 调用
2018-06-20 21:07 733package com.gpcsoft.xjmodule.ut ... -
猎狗方式调用接口
2017-09-27 08:36 598package boce.hit.dog; import j ... -
netty 实现长连接
2017-08-24 09:52 12561.server 端信息 package com.boce.n ... -
netty 开发入门
2017-08-22 14:30 6351.准备jar <properties> & ... -
nio 编程实例
2017-08-16 14:15 5691.编写服务端 package com.boce.nio.s ... -
jwt 生成token 和解析token
2017-06-06 16:45 5862<jjwt.version>0.6.0</j ... -
java 命令
2017-04-20 16:42 351java 命令: java -Djava.ext.dirs ... -
nio 通讯
2017-04-01 15:41 487nio 服务端: package nio.study.se ... -
HashMap 便利时不按照输入顺序输出
2017-03-27 17:11 1899使用:hashmap传输数据时,便利map中的数据时,发现 ... -
使用Lock,对不同商品加锁
2017-03-13 10:52 1211package com.boce.gbkutf; ... -
json 转泛型的集合类
2017-03-07 16:21 1175package com.boce.test; ... -
httpclient4.5 使用post方式提交请求
2017-03-03 11:00 1955private RequestConfig req ... -
GBK与UTF-8 字符串互转
2017-02-24 11:17 2140package com.cloud.tools; i ...
相关推荐
第7章主要介绍了高并发框架Akka的基本使用方法,并使用Ak:ka框架实现了 个简单的粒子群算法, 模拟超高并发的场景。第8章介绍了使用Eclipse进行多线程调试的方法, 并演示了通过Eclipse进行多线程调试重现ArrayList...
大型电商项目实战1:Redis+Rest+Linux+Nginx+Spring+SpringMVC实现JAVA高并发秒杀系统,baidu链接,谢谢
基于SpringBoot实现Java高并发之秒杀系统源码(含数据库).rar
Java 模拟线程并发 Java, 模拟线程并发,线程,并发 Java, 模拟线程并发,线程,并发 Java, 模拟线程并发,线程,并发 Java, 模拟线程并发,线程,并发
java高并发秒杀api源码
实战java高并发程序设计 分章 高清 带作业, 葛一鸣等人编著
java高并发,编程,技术宝典。java高并发,编程,技术宝典。java高并发,编程,技术宝典。java高并发,编程,技术宝典。java高并发,编程,技术宝典。
JAVA 高并发 实践书籍 附目录JAVA 高并发 实践书籍 附目录JAVA 高并发 实践书籍 附目录
本书主要讲解了一些高并发相关的信息,值得读一读的。。。。
Java + Netty 实现的高并发高可用MQTT服务broker,轻松支持10万并发,已用于生产环境 技术体系:(使用 netty 实现通信及协议解析,使用 nutzboot 提供依赖注入及属性配置,使用 redis 实现消息缓存,集群,使用 ...
JAVA并发编程与高并发解决方案 JAVA高并发项目实战课程
《实战Java高并发程序设计》 第二版随书代码
java高并发程序设计视频全集,并发场景,死锁,活锁,阻塞,非阻塞...
本文档主要系统性的总结和阐述了与Java并发相关的知识点
Java高并发笔记.pdf
实战Java高并发程序设计 电子书下载,如有侵权请联系删除
本书深入浅出的介绍了java线程和并发,是一本完美的java开发手册。
java 高并发解决思路 文档中涉及到很多实例
Java高并发程序设计模式