- 浏览: 494934 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (563)
- 工作经验 (12)
- 数据库 (13)
- Servlet (10)
- Struts2 (1)
- Spring (25)
- Eclipse (5)
- Hibernate (5)
- Eclips (8)
- HTTP (7)
- J2EE (21)
- EHcache (1)
- HTML (11)
- 工具插件使用 (20)
- JPA (2)
- 杂谈 (17)
- 数据结构与算法 (3)
- Cloud Foundry (1)
- 安全 (10)
- J2SE (57)
- SQL (9)
- DB2 (6)
- 操作系统 (2)
- 设计模式 (1)
- 版本代码管理工具 (13)
- 面试 (10)
- 代码规范 (3)
- Tomcat (12)
- Ajax (5)
- 异常总结 (11)
- REST (2)
- 云 (2)
- RMI (3)
- SOA (1)
- Oracle (12)
- Javascript (20)
- jquery (7)
- JSP自定义标签 (2)
- 电脑知识 (5)
- 浏览器 (3)
- 正则表达式 (3)
- 建站解决问题 (38)
- 数据库设计 (3)
- git (16)
- log4j (1)
- 每天100行代码 (1)
- socket (0)
- java设计模式 耿祥义著 (0)
- Maven (14)
- ibatis (7)
- bug整理 (2)
- 邮件服务器 (8)
- Linux (32)
- TCP/IP协议 (5)
- java多线程并发 (7)
- IO (1)
- 网页小工具 (2)
- Flash (2)
- 爬虫 (1)
- CSS (6)
- JSON (1)
- 触发器 (1)
- java并发 (12)
- ajaxfileupload (1)
- js验证 (1)
- discuz (2)
- Mysql (14)
- jvm (2)
- MyBatis (10)
- POI (1)
- 金融 (1)
- VMWare (0)
- Redis (4)
- 性能测试 (2)
- PostgreSQL (1)
- 分布式 (2)
- Easy UI (1)
- C (1)
- 加密 (6)
- Node.js (1)
- 事务 (2)
- zookeeper (3)
- Spring MVC (2)
- 动态代理 (3)
- 日志 (2)
- 微信公众号 (2)
- IDEA (1)
- 保存他人遇到的问题 (1)
- webservice (11)
- memcached (3)
- nginx (6)
- 抓包 (1)
- java规范 (1)
- dubbo (3)
- xwiki (1)
- quartz (2)
- 数字证书 (1)
- spi (1)
- 学习编程 (6)
- dom4j (1)
- 计算机系统知识 (2)
- JAVA系统知识 (1)
- rpcf (1)
- 单元测试 (2)
- php (1)
- 内存泄漏cpu100%outofmemery (5)
- zero_copy (2)
- mac (3)
- hive (3)
- 分享资料整理 (0)
- 计算机网络 (1)
- 编写操作系统 (1)
- springboot (1)
最新评论
-
masuweng:
亦论一次OutOfMemoryError的定位与解错 -
变脸小伙:
引用[color=red][/color]百度推广中运用的技术 ...
Spring 3 mvc中返回pdf,json,xml等不同的view -
Vanillva:
不同之处是什么??
Mybatis中的like查询 -
thrillerzw:
转了。做个有理想的程序员
有理想的程序员必须知道的15件事 -
liujunhui1988:
觉得很有概括力
15 个必须知道的 Java 面试问题(2年工作经验)
源:http://kenwublog.com/concurrent-no-lock-tech-tip
评:
需求:某代码块要求每5秒只进入一次,并且在5秒边界处存在高并发。
public class Test {
public static void main(String[] args) throws InterruptedException {
final CyclicBarrier barrier = new CyclicBarrier(50); // 50个并发
final long interval = 5000; // 每5秒
Holder.time.set(System.currentTimeMillis());// 起始时间
for (int i = 0; i < 100; i++) {
new Thread() {
@Override
public void run() {
while (true) {
long now = System.currentTimeMillis();
// 时间原子操作+原子计数器实现无锁单线程进入
if (now - Holder.time.get() > interval && Holder.count.incrementAndGet() == 1) {
System.out.println("function block entered");
Holder.time.set(now);
Holder.count = new AtomicLong();
}
}
}
}.start();
}
}
static class Holder {
public static volatile AtomicLong time = new AtomicLong();
public static AtomicLong count = new AtomicLong();
}
}
其实思路也比较简单,首先通过计数器保证同一时刻只能进入一个线程,然后重置时间,最后重置计数器,亮点是计数器的重置只能通过new,不能set(0),set(0)会导致同一时刻其余并发线程看到0值,从而误进入代码块。而new可以保证其他并发线程一直hold在老的对象上累加,new只对后面的新线程起到可见性(volatile),加上之前的时间已经重置,条件判断里能严格保证代码块只进入一次。
当然,这种情况也只能保证99.9%的场景,在多核场景下如果系统做了CPU指令重排序后,那就有可能不止一次进入,我通过压测1000个线程,就出现过1次进入了2次。但基本也满足我的场景需要了。
评:
引用
Holder.count.set(0) 会出现 ABA的问题,new也是解决不了问题的
除非假设 代码块执行时间长些,或者对时间的控制更精确
new 临时解决了问题 只是说明 执行new操作 cpu花费的时间长一些
假如同步代码块内假如等待3秒代码,set(0)也可以实现此需求
除非假设 代码块执行时间长些,或者对时间的控制更精确
new 临时解决了问题 只是说明 执行new操作 cpu花费的时间长一些
假如同步代码块内假如等待3秒代码,set(0)也可以实现此需求
需求:某代码块要求每5秒只进入一次,并且在5秒边界处存在高并发。
public class Test {
public static void main(String[] args) throws InterruptedException {
final CyclicBarrier barrier = new CyclicBarrier(50); // 50个并发
final long interval = 5000; // 每5秒
Holder.time.set(System.currentTimeMillis());// 起始时间
for (int i = 0; i < 100; i++) {
new Thread() {
@Override
public void run() {
while (true) {
long now = System.currentTimeMillis();
// 时间原子操作+原子计数器实现无锁单线程进入
if (now - Holder.time.get() > interval && Holder.count.incrementAndGet() == 1) {
System.out.println("function block entered");
Holder.time.set(now);
Holder.count = new AtomicLong();
}
}
}
}.start();
}
}
static class Holder {
public static volatile AtomicLong time = new AtomicLong();
public static AtomicLong count = new AtomicLong();
}
}
其实思路也比较简单,首先通过计数器保证同一时刻只能进入一个线程,然后重置时间,最后重置计数器,亮点是计数器的重置只能通过new,不能set(0),set(0)会导致同一时刻其余并发线程看到0值,从而误进入代码块。而new可以保证其他并发线程一直hold在老的对象上累加,new只对后面的新线程起到可见性(volatile),加上之前的时间已经重置,条件判断里能严格保证代码块只进入一次。
当然,这种情况也只能保证99.9%的场景,在多核场景下如果系统做了CPU指令重排序后,那就有可能不止一次进入,我通过压测1000个线程,就出现过1次进入了2次。但基本也满足我的场景需要了。
发表评论
-
自旋锁、排队自旋锁、MCS锁、CLH锁
2016-02-19 17:08 478源:http://coderbee.net/index.php ... -
java.util.concurrent.locks.LockSupport
2014-12-28 19:56 586源:http://my.oschina.net/readjav ... -
Spring线程池开发实战
2014-12-12 10:44 463源:http://blog.csdn.net/chszs/ar ... -
自旋锁(Spin lock) 自旋锁是指当一个线程尝试获取某个锁时,如果该锁已被其他线程占用,就一直循环检测锁是否被释放,而不是进入线程挂起或睡眠状态。 自
2014-11-05 10:36 591源:http://coderbee.net/index.php ... -
Java偏向锁实现原理(Biased Locking)
2014-10-21 17:51 1255源:http://kenwublog.com/theory-o ... -
Java 6 JVM参数选项大全(中文版)
2014-10-21 17:51 612源:http://kenwublog.com/docs/jav ... -
Java轻量级锁原理详解(Lightweight Locking)
2014-10-21 17:50 641源:http://kenwublog.com/theo ... -
08.JAVA同步块
2014-01-09 21:03 0源:http://ifeve.com/synchronized ... -
07.线程安全及不可变性
2014-01-09 21:02 0源:07.线程安全及不可变性 评: 原文链接 作者:Jakob ... -
06.线程安全与共享资源
2014-01-09 21:02 0源:http://ifeve.com/thread-safet ... -
05.竞态条件与临界区
2014-01-09 21:01 0源:http://ifeve.com/race-conditi ... -
04.如何创建并运行java线程
2014-01-09 20:58 407源:http://ifeve.com/creating-and ... -
03.多线程的代价
2014-01-09 20:57 375源:http://ifeve.com/costs-of ... -
02.多线程的优点
2014-01-09 20:56 334源:http://ifeve.com/benefits/ 评: ... -
01.Java并发性和多线程介绍
2014-01-09 11:11 628源:http://ifeve.com/java-con ...
相关推荐
程序并发执行任务时,对公有变量一般情况都是需要利用悲观锁进行锁定,该代码可以通过乐观锁(即无锁)来实现公有变量的访问
本篇文章是对C++无锁队列的实现进行了详细的分析介绍,需要的朋友参考下
在两种派别对应在并发中就是加锁和无锁,也就是说加锁是一种悲观的策略,而无锁是一种乐观的策略。对于锁,如果有多个线程同事访问一个临界资源,宁可牺牲性能让线程等待,也不会让一个线程不加锁访问临界资源。对于...
目录记忆池此仅标头的C ++ 17库提供了一种简单的一致的无锁的单个类型元素的内存池的实现。 元素类型作为第一个模板参数传递。细节界面 template < typename xss=removed xss=removed> >class MemoryPool final{...
在Linux 系统下面用C 语言实现的高并发服务器的代码,具体用到了Epoll,线程池,数据库连接池。 具体可以看下连接http://blog.csdn.net/wuyuxing24/article/details/48758927
LockFreeHashMap-rs Rust的并发,无锁哈希映射。 这是Cliff Click博士创建的无锁哈希映射的实现。 点击发表的对他的哈希映射。 此外,“参考” Java代码可以及最近的。入门该板条箱可在上。 要在您的项目中使用此...
配套代码讲解:https://blog.csdn.net/songchuwang1868/article/details/90200251 ...同步队列-无锁队列-循环数组无锁队列 同步队列-无锁队列-循环数组无锁队列 同步队列-无锁队列-循环数组无锁队列
结合减短的linux内核代码,详细的描述了无锁编程的应用,做并行程序设计的应该了解一下。
实现了Android程序第一次使用时启动了引导界面,而以后使用的时候就不启动了。。。
cht cht提供了一个无锁哈希表,该表支持完全并发的查找,插入,修改和删除。 该表也可能是并行的。cht cht提供了一个无锁的哈希表,该表支持完全并发的查找,插入,修改和删除。 还可以同时调整表的大小,以允许插入...
根据《多处理器编程的艺术》一书第七章“自旋锁与争用”编写的C++代码,演示了10种锁的实现。代码为本人学习研究所用,欢迎高手赐教。
1.写入日志信息的参数化,类似fprint,printf功能 2.定时保存日志信息到硬盘,默认参数为3000毫秒 3.日志信息达到一定容量后自动保存到硬盘4.该动态库实现了高效性
iOS 自定义UITableViewCell上添加UIButton按钮点击实现,知道点击了是哪个cell上的按钮。用代理跟代码块两种方式实现。
AspNetCore高并发示例代码。描述如何使用基于Redis的分布式锁定。 无锁和排队的商品库存操作。 分为三个例子 1.基于redis的分布式锁 2,基于Redis的原子操作使用lua脚本 3,基于Redis的原子操作使用Lua脚本和Kafka
将所有的请求全部压入一个队列中。服务器监控队列,如果队列中有请求,则处理请求。如下面的代码中,服务器就起了100个线程来监控队列,如果队列中有请求,则插入数据库。在实际的应用中,服务器监控程序也可以起到...
并发DS 基于锁的无锁并发数据结构的源代码
行业分类-设备装置-可执行代码数据的无锁流传送.zip
Android应用自动更新代码实现,完美实现代码的自动更新。