1. 背景
java.util.concurrent.atomic这个包是非常实用,解决了我们以前自己写一个同步方法来实现类似于自增长字段的问题。
在Java语言中,增量操作符(++)不是原子的,也就是非线程安全的;在使用的时候,要保证数据同步,就需要使用类似于synchronized关键字等手段来保证数据正确。正因为如此,《Java:多线程,线程同步,synchronized关键字的用法(同步代码块、非静态同步方法、静态同步方法)》一文中用synchronized关键字来实现一个自增长的字段。
2. 实现代码
如今使用java.util.concurrent.atomic包,问题简单多了。示范代码如下(没有synchronized关键字,没有Lock锁):
package com.clzhang.sample.thread; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; public class SimpleTest implements Runnable { // 创建AtomicInteger,初始值0(也可以指定初始值) // private static final AtomicInteger nextSerialNum = new AtomicInteger(); private static final AtomicLong nextSerialNum = new AtomicLong(); @Override public void run() { // 直接取得当前值并增长1 System.out .println(Thread.currentThread().getName() + ":" + nextSerialNum.getAndIncrement()); try { Thread.sleep(100); } catch (InterruptedException e) { } } public static void main(String[] args) { SimpleTest st = new SimpleTest(); for (int i = 0; i < 100; i++) { new Thread(st, "Thread" + i).start(); } } }
部分输出:
Thread92:60
Thread94:59
Thread95:58
Thread90:57
Thread88:56
Thread93:55