JDK1.5 AtomicLong实例

类 AtomicLong

可以用原子方式更新的 long 值。有关原子变量属性的描述,请参阅 java.util.concurrent.atomic 包规范。AtomicLong 可用在应用程序中(如以原子方式增加的序列号),并且不能用于替换 Long。但是,此类确实扩展了 Number,允许那些处理基于数字类的工具和实用工具进行统一访问。

常见方法

long addAndGet(long delta):以原子方式将给定值与当前值相加。

boolean compareAndSet(long expect, long update):如果当前值 == 预期值,则以原子方式将该值设置为给定的更新值。

long decrementAndGet():以原子方式将当前值减 1。

double doubleValue():以 double 形式返回指定的数值。

float floatValue():以 float 形式返回指定的数值。

long get():获取当前值。

软件包 java.util.concurrent.atomic

类的小工具包,支持在单个变量上解除锁定的线程安全编程。

类摘要

AtomicBoolean

可以用原子方式更新的 boolean 值。

AtomicInteger

可以用原子方式更新的 int 值。

AtomicIntegerArray

可以用原子方式更新其元素的 int 数组。

AtomicIntegerFieldUpdater<T>

基于反射的实用工具,可以对指定类的指定 volatile int 字段进行原子更新。

AtomicLong

可以用原子方式更新的 long 值。

AtomicLongArray

可以用原子方式更新其元素的 long 数组。

AtomicLongFieldUpdater<T>

基于反射的实用工具,可以对指定类的指定 volatile long 字段进行原子更新。

AtomicMarkableReference<V>

AtomicMarkableReference 维护带有标记位的对象引用,可以原子方式对其进行更新。

AtomicReference<V>

可以用原子方式更新的对象引用。

AtomicReferenceArray<E>

可以用原子方式更新其元素的对象引用数组。

AtomicReferenceFieldUpdater<T,V>

基于反射的实用工具,可以对指定类的指定 volatile reference 字段进行原子更新。

AtomicStampedReference<V>

AtomicStampedReference 维护带有整数“标志”的对象引用,可以原子方式对其进行更新。

实例1:

  1. package com.bijian.thread;
  2. import java.util.concurrent.atomic.AtomicLong;
  3. import java.util.concurrent.locks.Lock;
  4. public class MyRunnable implements Runnable {
  5. private static AtomicLong aLong = new AtomicLong(10000); // 原子量,每个线程都可以自由操作
  6. private String name; // 操作人
  7. private int x; // 操作数额
  8. private Lock lock;
  9. MyRunnable(String name, int x, Lock lock) {
  10. this.name = name;
  11. this.x = x;
  12. this.lock = lock;
  13. }
  14. public void run() {
  15. System.out.println(name + "执行了" + x + ",当前余额:" + aLong.addAndGet(x));
  16. aLong.addAndGet(1);
  17. }
  18. }
  1. package com.bijian.thread;
  2. import java.util.concurrent.ExecutorService;
  3. import java.util.concurrent.Executors;
  4. import java.util.concurrent.locks.Lock;
  5. import java.util.concurrent.locks.ReentrantLock;
  6. public class Main {
  7. public static void main(String[] args) {
  8. ExecutorService pool = Executors.newFixedThreadPool(2);
  9. Lock lock = new ReentrantLock(false);
  10. Runnable t1 = new MyRunnable("张三", 2000, lock);
  11. Runnable t2 = new MyRunnable("李四", 3600, lock);
  12. Runnable t3 = new MyRunnable("王五", 2700, lock);
  13. Runnable t4 = new MyRunnable("老张", 600, lock);
  14. Runnable t5 = new MyRunnable("老牛", 1300, lock);
  15. Runnable t6 = new MyRunnable("胖子", 800, lock);
  16. // 执行各个线程
  17. pool.execute(t1);
  18. pool.execute(t2);
  19. pool.execute(t3);
  20. pool.execute(t4);
  21. pool.execute(t5);
  22. pool.execute(t6);
  23. // 关闭线程池
  24. pool.shutdown();
  25. }
  26. }

运行结果:

  1. 李四执行了3600,当前余额:13600
  2. 张三执行了2000,当前余额:15600
  3. 王五执行了2700,当前余额:18302
  4. 老张执行了600,当前余额:18903
  5. 老牛执行了1300,当前余额:20203
  6. 胖子执行了800,当前余额:21004

应该是每个线程执行后都会执行aLong.addAndGet(1);语句,但实际结果却不是这样的,原因是:虽然long addAndGet(long delta)方法是以原子方式将给定值与当前值相加,但两条两句在一块,也只能表示它们各自的执行是原子级的,它们作为一个整体却不是原子级的。

 

于是,我们稍微修改一下MyRunnable类,给它加上锁,即可达到我们预想的目的,如下实例2所示。

实例2(修改MyRunnable类):

  1. package com.bijian.thread;
  2. import java.util.concurrent.atomic.AtomicLong;
  3. import java.util.concurrent.locks.Lock;
  4. public class MyRunnable implements Runnable {
  5. private static AtomicLong aLong = new AtomicLong(10000); // 原子量,每个线程都可以自由操作
  6. private String name; // 操作人
  7. private int x; // 操作数额
  8. private Lock lock;
  9. MyRunnable(String name, int x, Lock lock) {
  10. this.name = name;
  11. this.x = x;
  12. this.lock = lock;
  13. }
  14. public void run() {
  15. lock.lock();
  16. System.out.println(name + "执行了" + x + ",当前余额:" + aLong.addAndGet(x));
  17. aLong.addAndGet(1);
  18. lock.unlock();
  19. }
  20. }

运行结果:

  1. 张三执行了2000,当前余额:12000
  2. 李四执行了3600,当前余额:15601
  3. 王五执行了2700,当前余额:18302
  4. 老张执行了600,当前余额:18903
  5. 胖子执行了800,当前余额:19704
  6. 老牛执行了1300,当前余额:21005

JDK1.5 AtomicLong实例的更多相关文章

  1. CAS在Java类中的应用

    CAS 这个指令全称 compare and swap 即比较替换指令,在现代处理器新加入的指令.指导思想:基于乐观锁机制.比较一个变量在内存值中的值和变量的当前值(旧值).如果相等,则认为该变量没有 ...

  2. Java 并发工具包 java.util.concurrent 用户指南

    1. java.util.concurrent - Java 并发工具包 Java 5 添加了一个新的包到 Java 平台,java.util.concurrent 包.这个包包含有一系列能够让 Ja ...

  3. Metrics介绍

    Metrics可以为你的代码的运行提供无与伦比的洞察力.作为一款监控指标的度量类库,它提供了很多模块可以为第三方库或者应用提供辅助统计信息, 比如Jetty, Logback, Log4j, Apac ...

  4. 第三十五章 metrics(3)- codahale-metrics基本使用

    <!-- metrics --> <dependency> <groupId>io.dropwizard.metrics</groupId> <a ...

  5. Java并发编程-并发工具包(java.util.concurrent)使用指南(全)

    1. java.util.concurrent - Java 并发工具包 Java 5 添加了一个新的包到 Java 平台,java.util.concurrent 包.这个包包含有一系列能够让 Ja ...

  6. Java_并发工具包 java.util.concurrent 用户指南(转)

    译序 本指南根据 Jakob Jenkov 最新博客翻译,请随时关注博客更新:http://tutorials.jenkov.com/java-util-concurrent/index.html.本 ...

  7. (转)并发编程 – Concurrent 用户指南

    原文出处: 高广超 译序 本指南根据 Jakob Jenkov 最新博客翻译,请随时关注博客更新:http://tutorials.jenkov.com/java-util-concurrent/in ...

  8. Java实时监控类库Metrics

    随着系统越来越大,越来越复杂,我们需要在业务方面加上一些监控服务.Metrics作为一款监控指标的度量类库,提供了许多工具帮助开发者来完成自定义的监控工作. 使用Metrics 使用Metrics,只 ...

  9. 并发编程 – Concurrent 用户指南--转

    1. java.util.concurrent – Java 并发工具包 Java 5 添加了一个新的包到 Java 平台,java.util.concurrent 包.这个包包含有一系列能够让 Ja ...

随机推荐

  1. HDU 6205[计算几何,JAVA]

    题目链接[http://acm.hdu.edu.cn/showproblem.php?pid=6206] 题意: 给出不共线的三个点,和一个点(x,y),然后判断(x,y)在不在这三个点组成的圆外. ...

  2. BZOJ2754 SCOI2012喵星球上的点名

    绝世好题. 正当我犹豫不决时,hzwer说:“MAP!!!” 没错这题大大的暴力,生猛的stl,贼基尔爽,,ԾㅂԾ,, 由于我们求点名在名字中的子串个数,所以将点名建AC自动机,记录节点属于哪次点名, ...

  3. Ural 1519 Formula 1 插头DP

    这是一道经典的插头DP单回路模板题. 用最小表示法来记录连通性,由于二进制的速度,考虑使用8进制. 1.当同时存在左.上插头的时候,需要判断两插头所在连通块是否相同,若相同,只能在最后一个非障碍点相连 ...

  4. python开发_python日期操作

    在python中对日期进行操作的库有: import datetime import time 对日期格式化信息,可以参考官方API: time.strftime datetime 下面是我做的dem ...

  5. [转]安卓虚拟机启动后报错: 类似 SDK Manager] Error: Error parsing .devices.xml 解决方案

    昨天用android sdk manager 更新了android sdk, 我是在myeclipse上面安装adt来开发android的现在每次打开myeclipse都报错, 而且我每次打开虚拟机的 ...

  6. mybatis源码分析(7)-----缓存Cache(一级缓存,二级缓存)

    写在前面  MyBatis 提供查询缓存,用于减轻数据库压力,提高数据库性能. MyBatis缓存分为一级缓存和二级缓存. 通过对于Executor 的设计.也可以发现MyBatis的缓存机制(采用模 ...

  7. Centos 6/ 7下通过yum安装php7环境

    本文转自:云溪社区 2015年12月初PHP7正式版发布,迎来自2004年以来最大的版本更新.PHP7最显著的变化就是性能的极大提升,已接近Facebook开发的PHP执行引擎HHVM.在WordPr ...

  8. Using an open debug interconnect model to simplify embedded systems design

    Using an open debug interconnect model to simplify embedded systems design Tom Cunningham, Freescale ...

  9. nodejs之处理GET请求

    一个简单的httpserver.接收get请求,并返回解析之后的数据. 以下是服务的代码: var http = require("http"); var url = requir ...

  10. u-boot懂你并不难

    转载:http://blog.chinaunix.net/uid-28236237-id-3865045.html u-boot第一阶段分析(一) u-boot 第一阶段分析(二) u-boot 第二 ...