java并发编程(一):计数器
2016-03-09 13:40
591 查看
买了一本《java并发编程的艺术 》,开启学习并发编程之路。
根据jdk提供的原生的原子变量计数。
根据上面的代码,其中compareAndSet方法是关键,safeCount方法里面有一个死循环,首先获得当前值i,然后当前值加1作为更新值,如果当前值i没有发生变化则用更新值替换当前值,如果当前值改变了,那么就继续循环下去。
根据jdk提供的原生的原子变量计数。
package test201603; import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; /** * 计数器 */ public class Counter { private AtomicInteger atomicI = new AtomicInteger(0); public static void main(String[] args) { final Counter cas = new Counter(); List<Thread> ts = new ArrayList<Thread>(600); for (int j = 0; j < 100; j++) { Thread t = new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 10000; i++) { cas.safeCount(); } } }); ts.add(t); } //开启所有线程 for (Thread t : ts) { t.start(); } // 等待所有线程执行完成 for (Thread t : ts) { try { t.join(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(cas.atomicI.get()); } /** * 使用CAS实现线程安全计数器 */ private void safeCount() { for (;;) { int i = atomicI.get(); boolean suc = atomicI.compareAndSet(i, ++i); if (suc) { break; } } } }
根据上面的代码,其中compareAndSet方法是关键,safeCount方法里面有一个死循环,首先获得当前值i,然后当前值加1作为更新值,如果当前值i没有发生变化则用更新值替换当前值,如果当前值改变了,那么就继续循环下去。
相关文章推荐
- JavaEE(二)---Web 应用程序安全性问题及基本安全实施策略
- JavaEE(一)---Web服务编程,REST 与 SOAP
- Java异常处理详解
- java笔试题(一)
- openjdk和jdk区别
- 在Spring中调用基于CXF框架的webService
- SpringMVC+Spring+Hibernate+Maven+mysql整合
- Java的各种排序算法详解
- mvc-dispatcher-servlet.xml
- [Java并发包学习七]解密ThreadLocal
- [JAVA · 初级]:7.关键字:static
- 【java项目实践】详解Ajax工作原理以及实现异步验证用户名是否存在(java版)
- Java简单url识别
- 【SSH进阶之路】一步步重构容器实现Spring框架——彻底封装,实现简单灵活的Spring框架(十一)
- 【SSH进阶之路】一步步重构容器实现Spring框架——配置文件+反射实现IoC容器(十)
- springmvc和struts2的区别(转)
- 【SSH进阶之路】一步步重构容器实现Spring框架——解决容器对组件的“侵入式”管理的两种方案--主动查找和控制反转(九)
- JAVA把字符串当作表达式执行
- 【SSH进阶之路】一步步重构容器实现Spring框架——从一个简单的容器开始(八)
- 【SSH进阶之路】Spring的AOP逐层深入——采用注解完成AOP(七)