目录
原子性方法
利用循环+CAS,实现操作的原子性。
一、主程序
package xyz.jangle.thread.test.n8_xi.atomic;
/**
* 8.11、自定义原子性对象
* @author jangle
* @email jangle@jangle.xyz
* @time 2020年10月11日 下午4:41:24
*
*/
public class M {
public static void main(String[] args) throws Exception {
ParkingCounter counter = new ParkingCounter(5);
var sensor1 = new Sensor1(counter);
var sensor2 = new Sensor2(counter);
var thread1 = new Thread(sensor1);
var thread2 = new Thread(sensor2);
thread1.start();
thread2.start();
thread1.join();
thread2.join();
System.out.println("M:车子数量"+counter.get());
System.out.println("M:程序结束");
}
}
二、自定义原子性对象
package xyz.jangle.thread.test.n8_xi.atomic;
import java.util.concurrent.atomic.AtomicInteger;
/**
*
* 自定义原子性对象
* @author jangle
* @email jangle@jangle.xyz
* @time 2020年10月11日 下午4:43:37
*
*/
@SuppressWarnings("serial")
public class ParkingCounter extends AtomicInteger {
private final int maxNumber;
public ParkingCounter(int maxNumber) {
set(0);
this.maxNumber = maxNumber;
}
/**
* 进车
*
* @return
*/
public boolean carIn() {
for(;;) {
int value = get();
if (value == maxNumber) {
System.out.println("停车位已满");
return false;
} else {
int newValue = value +1;
boolean changed = compareAndSet(value, newValue);
if(changed) {
System.out.println("成功停车:"+newValue);
return true;
}
}
}
}
/**
* 出车
*
* @return
*/
public boolean carOut() {
for(;;) {
int value = get();
if (value == 0) {
System.out.println("没有车辆可以开出");
return false;
} else {
int newValue = value -1;
boolean changed = compareAndSet(value, newValue);
if(changed) {
System.out.println("成功出车:"+newValue);
return true;
}
}
}
}
}
三、执行线程1
package xyz.jangle.thread.test.n8_xi.atomic;
/**
* @author jangle
* @email jangle@jangle.xyz
* @time 2020年10月11日 下午4:48:56
*
*/
public class Sensor1 implements Runnable {
private final ParkingCounter counter;
public Sensor1(ParkingCounter counter) {
this.counter = counter;
}
@Override
public void run() {
counter.carIn();
counter.carIn();
counter.carIn();
counter.carIn();
counter.carOut();
counter.carOut();
counter.carOut();
counter.carIn();
counter.carIn();
counter.carIn();
}
}
四、执行线程2
package xyz.jangle.thread.test.n8_xi.atomic;
/**
* @author jangle
* @email jangle@jangle.xyz
* @time 2020年10月11日 下午4:50:13
*
*/
public class Sensor2 implements Runnable {
private ParkingCounter counter;
public Sensor2(ParkingCounter counter) {
this.counter = counter;
}
@Override
public void run() {
counter.carIn();
counter.carOut();
counter.carOut();
counter.carIn();
counter.carIn();
counter.carIn();
counter.carIn();
counter.carIn();
counter.carIn();
}
}
五、执行结果
成功停车:1
成功停车:2
成功出车:2
成功停车:3
成功出车:1
成功停车:3
成功停车:2
成功停车:4
停车位已满
停车位已满
停车位已满
停车位已满
成功停车:5
成功出车:4
成功出车:3
成功出车:2
成功停车:3
成功停车:4
成功停车:5
M:车子数量5
M:程序结束