目录
一、JDK5提供的原子类
- 一、JDK5提供的原子类
- 二、使用JDK5提供的原子类(更新基本类型)的代码示例
- 三、使用JDK5提供的原子类(更新数组类型)的代码示例
- java.util.concurrent.atomic包下的类
1、代码
package com.xz.thread.t7;
import java.util.concurrent.atomic.AtomicInteger;
/**
* @description: 使用JDK5提供的原子类解决多线程安全问题
* @author: xz
*/
public class Sequeue {
//私有变量使用JDK5提供的AtomicInteger原子类
private AtomicInteger value=new AtomicInteger(0);
public int getNext(){
//获取并且自增,非原子操作都可转化为原子操作
return value.getAndIncrement();
}
public static void main(String[] args) {
Sequeue sequeue = new Sequeue();
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+" "+sequeue.getNext());
try {
Thread.sleep(100);
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
while(true){
System.out.println(Thread.currentThread().getName()+" "+sequeue.getNext());
try {
Thread.sleep(100);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
while(true){
System.out.println(Thread.currentThread().getName()+" "+sequeue.getNext());
try {
Thread.sleep(100);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}).start();
}
}
2、输出结果
3、结论
- 由上图第2步骤可知,使用JDK5提供的原子类在多线程环境下(更新基本类型)数据,没有产生重复值,解决了多线程安全问题。
1、代码
package com.xz.thread.t7;
import java.util.concurrent.atomic.AtomicIntegerArray;
/**
* @description: 使用JDK5提供的原子类(更新数组类型)的代码示例
* @author: xz
*/
public class SequeueArr {
private int[] a= {1,3,5,7};//定义一个数组
AtomicIntegerArray atomicIntegerArray =new AtomicIntegerArray(a);
public int getNext(){
//getAndAdd(int i, int delta) 给某一个位置的值增加多少
return atomicIntegerArray.getAndAdd(0,10);
}
public static void main(String[] args) {
SequeueArr sequeueArr = new SequeueArr();
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+" "+sequeueArr.getNext());
try {
Thread.sleep(100);
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
while(true){
System.out.println(Thread.currentThread().getName()+" "+sequeueArr.getNext());
try {
Thread.sleep(100);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
while(true){
System.out.println(Thread.currentThread().getName()+" "+sequeueArr.getNext());
try {
Thread.sleep(100);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}).start();
}
}
2、输出结果
3、结论
- 由上图第2步骤可知,使用JDK5提供的原子类在多线程环境下(更新数组类型)数据,没有产生重复值,解决了多线程安全问题。