- 浏览: 513627 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (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 501源:http://coderbee.net/index.php ... -
java.util.concurrent.locks.LockSupport
2014-12-28 19:56 613源:http://my.oschina.net/readjav ... -
Spring线程池开发实战
2014-12-12 10:44 498源:http://blog.csdn.net/chszs/ar ... -
自旋锁(Spin lock) 自旋锁是指当一个线程尝试获取某个锁时,如果该锁已被其他线程占用,就一直循环检测锁是否被释放,而不是进入线程挂起或睡眠状态。 自
2014-11-05 10:36 629源:http://coderbee.net/index.php ... -
Java偏向锁实现原理(Biased Locking)
2014-10-21 17:51 1294源:http://kenwublog.com/theory-o ... -
Java 6 JVM参数选项大全(中文版)
2014-10-21 17:51 641源:http://kenwublog.com/docs/jav ... -
Java轻量级锁原理详解(Lightweight Locking)
2014-10-21 17:50 675源: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 452源:http://ifeve.com/creating-and ... -
03.多线程的代价
2014-01-09 20:57 417源:http://ifeve.com/costs-of ... -
02.多线程的优点
2014-01-09 20:56 370源:http://ifeve.com/benefits/ 评: ... -
01.Java并发性和多线程介绍
2014-01-09 11:11 670源:http://ifeve.com/java-con ...
相关推荐
下面将详细解释Java高并发编程的基础概念、核心技术以及实现技巧。 ### Java高并发编程基础 #### 1. 并发与并行的概念 - **并发**:是指在一段时间内多个程序或任务交替运行,从宏观上看似乎同时运行,但实际上...
- 这些类支持无锁操作,可以在高并发环境下高效地更新数值。 #### 4.3 线程安全集合 - `ConcurrentHashMap`:线程安全的哈希表,相比`synchronized`修饰的方法或代码块,具有更高的并发性能。 - `...
《JAVA并发编程实践》是一本深入探讨Java并发编程的权威指南,由Brian Goetz等作者撰写,这本书在Java开发者中享有很高的声誉。本书主要针对Java 5及更高版本的并发特性,涵盖了线程、锁、并发集合、原子变量、并发...
在共享内存模型中,多个线程可以访问同一块内存,通过锁、信号量等机制实现同步。而在消息传递模型中,线程间通过发送和接收消息进行通信,这种方式能更好地保证数据的一致性,但可能增加通信开销。 **线程同步与...
- **读写锁**:`std::shared_mutex`支持多个读线程共享资源的同时只允许一个写线程访问。 #### 五、内存模型与原子类型操作 ##### 5.1 内存模型 - C++11引入了一种统一的内存模型,它定义了线程之间如何一致地访问...
本项目“maopao1”的代码提供了CUDA冒泡排序的一个实例,对于初学者来说,通过阅读和理解代码,可以深入学习CUDA编程的基本原理和技巧,了解如何将传统的CPU算法移植到GPU上进行加速。然而,为了获得更高的性能,...
动态先入先出(FIFO)消息队列是一种常见的数据结构,它在计算机科学和IT领域中被广泛用于处理并发任务、数据交换以及系统间通信。...在实际开发中,理解其工作原理和优化技巧对于构建高性能的系统至关重要。
在Java编程中,多线程技术是实现高性能和并发处理的关键。当面临大量数据需要导入系统时,单线程处理可能会导致性能瓶颈,因此,利用多线程进行批量数据导入可以显著提高效率。本篇文章将深入探讨Java多线程批量数据...
4. 并发优化:避免多线程间的缓存竞争,合理使用锁,考虑使用无锁数据结构。 5. 内存分配策略:根据数据生命周期选择合适的内存分配区域,如堆、栈或常量池。 六、总结 掌握内存优化和CPU缓存知识是程序员提升代码...
标题“demo memary”似乎指的是一个关于内存管理的示例项目,而描述中的“赚积分、奉献自己的代码”可能是指这个项目是开源的,鼓励社区成员贡献代码来获取积分或荣誉。标签“内存管理”进一步确认了这个项目的核心...
通过将大文件分割成多个小块,每个线程负责处理一个或多个数据块,从而实现并行处理。这大大减少了整体处理时间,尤其在多核处理器上效果显著。在"bigfile_parse"项目中,源码可能包括对线程池的使用,以及如何合理...