并发编程:自定义并发类:10、自定义原子性对象

目录

原子性方法

一、主程序

二、自定义原子性对象

三、执行线程1

四、执行线程2

五、执行结果


原子性方法

利用循环+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:程序结束

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值