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
类的小工具包,支持在单个变量上解除锁定的线程安全编程。
类摘要 |
|
可以用原子方式更新的 boolean 值。 |
|
可以用原子方式更新的 int 值。 |
|
可以用原子方式更新其元素的 int 数组。 |
|
基于反射的实用工具,可以对指定类的指定 volatile int 字段进行原子更新。 |
|
可以用原子方式更新的 long 值。 |
|
可以用原子方式更新其元素的 long 数组。 |
|
基于反射的实用工具,可以对指定类的指定 volatile long 字段进行原子更新。 |
|
AtomicMarkableReference 维护带有标记位的对象引用,可以原子方式对其进行更新。 |
|
可以用原子方式更新的对象引用。 |
|
可以用原子方式更新其元素的对象引用数组。 |
|
基于反射的实用工具,可以对指定类的指定 volatile reference 字段进行原子更新。 |
|
AtomicStampedReference 维护带有整数“标志”的对象引用,可以原子方式对其进行更新。 |
实例1:
package com.bijian.thread; import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.locks.Lock; public class MyRunnable implements Runnable { private static AtomicLong aLong = new AtomicLong(10000); // 原子量,每个线程都可以自由操作 private String name; // 操作人 private int x; // 操作数额 private Lock lock; MyRunnable(String name, int x, Lock lock) { this.name = name; this.x = x; this.lock = lock; } public void run() { System.out.println(name + "执行了" + x + ",当前余额:" + aLong.addAndGet(x)); aLong.addAndGet(1); } }
package com.bijian.thread; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class Main { public static void main(String[] args) { ExecutorService pool = Executors.newFixedThreadPool(2); Lock lock = new ReentrantLock(false); Runnable t1 = new MyRunnable("张三", 2000, lock); Runnable t2 = new MyRunnable("李四", 3600, lock); Runnable t3 = new MyRunnable("王五", 2700, lock); Runnable t4 = new MyRunnable("老张", 600, lock); Runnable t5 = new MyRunnable("老牛", 1300, lock); Runnable t6 = new MyRunnable("胖子", 800, lock); // 执行各个线程 pool.execute(t1); pool.execute(t2); pool.execute(t3); pool.execute(t4); pool.execute(t5); pool.execute(t6); // 关闭线程池 pool.shutdown(); } }
运行结果:
李四执行了3600,当前余额:13600 张三执行了2000,当前余额:15600 王五执行了2700,当前余额:18302 老张执行了600,当前余额:18903 老牛执行了1300,当前余额:20203 胖子执行了800,当前余额:21004
应该是每个线程执行后都会执行aLong.addAndGet(1);语句,但实际结果却不是这样的,原因是:虽然long addAndGet(long delta)方法是以原子方式将给定值与当前值相加,但两条两句在一块,也只能表示它们各自的执行是原子级的,它们作为一个整体却不是原子级的。
于是,我们稍微修改一下MyRunnable类,给它加上锁,即可达到我们预想的目的,如下实例2所示。
实例2(修改MyRunnable类):
package com.bijian.thread; import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.locks.Lock; public class MyRunnable implements Runnable { private static AtomicLong aLong = new AtomicLong(10000); // 原子量,每个线程都可以自由操作 private String name; // 操作人 private int x; // 操作数额 private Lock lock; MyRunnable(String name, int x, Lock lock) { this.name = name; this.x = x; this.lock = lock; } public void run() { lock.lock(); System.out.println(name + "执行了" + x + ",当前余额:" + aLong.addAndGet(x)); aLong.addAndGet(1); lock.unlock(); } }
运行结果:
张三执行了2000,当前余额:12000 李四执行了3600,当前余额:15601 王五执行了2700,当前余额:18302 老张执行了600,当前余额:18903 胖子执行了800,当前余额:19704 老牛执行了1300,当前余额:21005
当然,AtomicLong是作用是对长整形进行原子操作。在32位操作系统中,64位的long 和 double 变量由于会被JVM当作两个分离的32位来进行操作,所以不具有原子性。而使用AtomicLong能让long的操作保持原子型。
相关推荐
每个Lock实例可以有多个Condition实例,从而可以实现不同的等待集合。 2. **Phaser** - 在3.1版本中,backport-util-concurrent引入了Phaser,这是一个可重用的同步帮助器类,支持多个参与者之间的有界同步,类似...
6. **新的集合工厂方法**:`List`、`Set`和`Map`接口新增了一些工厂方法,可以直接通过这些方法创建不可变的集合实例,如`Collections.emptyList()`、`Collections.emptyMap()`等。 7. **Optional类**:为了解决空...
异常链允许一个异常实例引用另一个异常实例作为其原因,提供了更好的错误追踪信息。 11. **内建对XML的支持**: Java 5增强了对XML处理的能力,包括JAXB(Java Architecture for XML Binding)和JDOM等库,使XML...
- **原子类型**:JDK5引入`java.util.concurrent.atomic`包,提供如`AtomicInteger`、`AtomicLong`等原子类,它们提供了原子性操作,如自增、自减等,确保在多线程环境下无需同步也能保证数据一致性。 在实际编程...
Java 种的自增可以使用 AtomicLong 或 synchronized 关键字来实现线程安全。 2. Jdk1.8 种的 stream 有用过吗,stream 的并行操作原理?Jdk1.8 的 stream 使用了函数式编程的思想,提供了并行操作的能力。 3. Jdk1.8...
Java 多线程 atomic 包是 Java 并发编程中的一种重要工具,自从 JDK 1.5 开始,Java 就提供了 java.util.concurrent.atomic 包,方便程序员在多线程环境下,无锁的进行原子操作。 atomic 包的出现极大地简化了多线程...
java8 看不到源码对象分配跟踪器 目的和范围 ...该代理使用AtomicLong来跟踪实例化以获得广泛的 JVM 支持。 一个特殊的 JDK 8 构建将使用LongAdder ,它在争用情况下具有更好的性能。 代理由PlatformMB
AtomicLong就是基于CAS实现的。 6. **指令重排序**:编译器或处理器为了优化性能,可能改变代码执行顺序,但结果必须保持一致。 7. **Synchronized关键字内存语义**:确保线程在访问共享资源时的互斥,保证了可见...
ThreadLocalRandom类是线程本地的Random类,每个线程都有自己的ThreadLocalRandom实例。使用ThreadLocalRandom类可以避免多线程环境中的性能瓶颈。 下面是ThreadLocalRandom类的使用示例代码: ```java public ...
- 普通类可以被实例化,而抽象类不能被实例化。 - 抽象类不能被声明为 `final`。 11. **接口与抽象类的区别** - 接口中的所有方法都是抽象的,而抽象类可以包含具体的方法。 - 类可以实现多个接口,但只能继承...
7. **ApplicationContext的初始化过程**:Spring的ApplicationContext在初始化时会加载配置文件,创建Bean实例,处理依赖注入,并在检测到循环依赖时使用三级缓存策略解决。 8. **GC收集器**:Java垃圾回收使用多种...
- **原子类**:AtomicInteger、AtomicLong等用于实现高效的并发计数。 - **ConcurrentHashMap**:利用其内部的分段锁机制实现计数器。 - **性能考量**:根据具体场景选择最合适的实现方案。 #### 37. 常用的Java ...
Spring AOP使用动态代理技术,对于实现了接口的类使用JDK动态代理,而对于未实现接口的类则使用Cglib代理。Spring AOP支持通过配置来指定增强逻辑,如前置通知、后置通知等。 #### 控制反转(IoC)设计思想 控制...
- **实现示例**:创建 ScheduledExecutorService 实例,使用 scheduleAtFixedRate() 或 scheduleWithFixedDelay() 方法安排任务。 综上所述,《深入浅出Java多线程.pdf》覆盖了Java多线程从基础知识到高级特性的...
此外,对于Java开发者来说,熟悉JVM的内存管理机制,如理解新生代、老年代的垃圾回收策略,以及如何使用JDK自带的JVisualVM或JProfiler等工具进行性能监控和分析,都是非常实用的技能。而在JUC方面,熟练掌握线程池...
- **Atomic 类**:Java 提供了 Atomic 包中的原子类,如 AtomicInteger、AtomicLong 等,用于实现线程安全的整型、浮点型和其他类型的操作。 - **ThreadLocal 类**:为线程提供了一种隔离机制,使得每个线程都可以...