在java.util.concurrent.atomic包下,有AtomicBoolean , AtomicInteger, AtomicLong, AtomicReference等类,它们的基本特性就是在多线程环境下,执行这些类实例包含的方法时,具有排他性,即当某个线程进入方法,执行其中的指令时,不会被其他线程打断,而别的线程就像自旋锁一样,一直等到该方法执行完成,才由JVM从等待队列中选择一个另一个线程进入。
java.util.concurrent.atomic.AtomicBoolean类:
1、getAndSet方法和compareAndSet方法的区别,这两个方法的区别在java的文档中记录的很明确了。
2、compareAndSet:如果当前值 == 预期值,则以原子方式将该值设置为给定的更新值。这里需要注意的是这个方法的返回值实际上是是否成功修改,而与之前的值无关。
3、getAndSet :以原子方式设置为给定值,并返回以前的值。
代码实例:package com.what21;
import java.util.concurrent.atomic.AtomicBoolean;
public class AtomicBooleanMain implements Runnable {
public static AtomicBoolean exits = new AtomicBoolean(false);
private String name;
public AtomicBooleanMain(String name) {
this.name = name;
}
@Override
public void run() {
if (exits.compareAndSet(false, true)) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(name + ",step 1");
System.out.println(name + ",step 2");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(name + ",step 3");
exits.set(false);
} else {
System.out.println(name + ",step else");
}
}
/**
* @param args
*/
public static void main(String[] args) {
Thread thread1 = new Thread(new AtomicBooleanMain("测试一"));
Thread thread2 = new Thread(new AtomicBooleanMain("测试二"));
thread1.start();
thread2.start();
//-------------------------------------------------------
Thread thread3 = new Thread(new AtomicBooleanMain("测试三"));
Thread thread4 = new Thread(new AtomicBooleanMain("测试四"));
thread3.start();
thread4.start();
}
}