并发编程:并发集合:原子性数组(AtomicIntegerArray)

目录

原子性数组

一、主程序

二、自增线程

三、自降线程

四、普通数组形式的自增线程(非线程安全)

五、普通数组形式的自降线程(非线程安全)

六、执行结果


原子性数组

Java提供以原子性操作整型和长整型数值的数组AtomicIntegerArray,AtomicLongArray。Java中普通数组形式的AtomicInteger[]并发线程安全的对象。

一、主程序

package xyz.jangle.thread.test.n7_9.atomicarray;

import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicIntegerArray;

/**
 *  7.9、原子性数组
 * @author jangle
 * @email jangle@jangle.xyz
 * @time 2020年9月17日 上午10:24:17
 * 
 */
public class M {

	public static void main(String[] args) {

		final int THREADS = 100;

		AtomicIntegerArray vector = new AtomicIntegerArray(1000);
		AtomicInteger[] vector2 = new AtomicInteger[1000];

		var incrementer = new Incrementer(vector);
		var decrementer = new Decrementer(vector);
		var incrementer2 = new Incrementer2(vector2);
		var decrementer2 = new Decrementer2(vector2);

		var incrementers = new Thread[THREADS];
		var decrementers = new Thread[THREADS];
		var incrementers2 = new Thread[THREADS];
		var decrementers2 = new Thread[THREADS];

		for (int i = 0; i < THREADS; i++) {
			incrementers[i] = new Thread(incrementer);
			decrementers[i] = new Thread(decrementer);
			incrementers[i].start();
			decrementers[i].start();
		}
		// 同步
		for (int i = 0; i < THREADS; i++) {
			try {
				incrementers[i].join();
				decrementers[i].join();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		int errors = 0;
		for (int i = 0; i < vector.length(); i++) {
			if (vector.get(i) != 0) {
				System.out.println("Vector[" + i + "] :" + vector.get(i));
				errors++;
			}
		}
		System.out.println("ERROR :" + errors);
		
		// ******** 以下是普通数组形式的   执行会发生异常。
		for (int i = 0; i < THREADS; i++) {
			incrementers2[i] = new Thread(incrementer2);
			decrementers2[i] = new Thread(decrementer2);
			incrementers2[i].start();
			decrementers2[i].start();
		}
		// 同步
		for (int i = 0; i < THREADS; i++) {
			try {
				incrementers2[i].join();
				decrementers2[i].join();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		errors = 0;
		for (int i = 0; i < vector2.length; i++) {
			if (vector.get(i) != 0) {
				System.out.println("Vector[" + i + "] :" + vector.get(i));
				errors++;
			}
		}
		System.out.println("ERROR2 :" + errors);

	}

}

二、自增线程

package xyz.jangle.thread.test.n7_9.atomicarray;

import java.util.concurrent.atomic.AtomicIntegerArray;

/**
 *  自增线程
 * @author jangle
 * @email jangle@jangle.xyz
 * @time 2020年9月17日 下午7:00:11
 * 
 */
public class Incrementer implements Runnable {

	private final AtomicIntegerArray vector;

	public Incrementer(AtomicIntegerArray vector) {
		super();
		this.vector = vector;
	}

	@Override
	public void run() {
		for (int i = 0; i < vector.length(); i++) {
			vector.getAndIncrement(i);
		}

	}

}

三、自降线程

package xyz.jangle.thread.test.n7_9.atomicarray;

import java.util.concurrent.atomic.AtomicIntegerArray;

/**
 *  自降线程
 * @author jangle
 * @email jangle@jangle.xyz
 * @time 2020年9月17日 下午7:03:15
 * 
 */
public class Decrementer implements Runnable {

	private AtomicIntegerArray vector;

	public Decrementer(AtomicIntegerArray vector) {
		super();
		this.vector = vector;
	}

	@Override
	public void run() {
		for (int i = 0; i < vector.length(); i++) {
			vector.getAndDecrement(i);
		}
	}

}

四、普通数组形式的自增线程(非线程安全)

package xyz.jangle.thread.test.n7_9.atomicarray;

import java.util.concurrent.atomic.AtomicInteger;

/**
 *  自增线程2  数组形式的Atomic
 * @author jangle
 * @email jangle@jangle.xyz
 * @time 2020年9月17日 下午7:00:11
 * 
 */
public class Incrementer2 implements Runnable {

	private final AtomicInteger[] vector;

	public Incrementer2(AtomicInteger[] vector) {
		super();
		this.vector = vector;
	}

	@Override
	public void run() {
		for (int i = 0; i < vector.length; i++) {
			vector[i].getAndIncrement();
		}
	}

}

五、普通数组形式的自降线程(非线程安全)

package xyz.jangle.thread.test.n7_9.atomicarray;

import java.util.concurrent.atomic.AtomicInteger;

/**
 *  自增线程2  数组形式的Atomic
 * @author jangle
 * @email jangle@jangle.xyz
 * @time 2020年9月17日 下午7:00:11
 * 
 */
public class Incrementer2 implements Runnable {

	private final AtomicInteger[] vector;

	public Incrementer2(AtomicInteger[] vector) {
		super();
		this.vector = vector;
	}

	@Override
	public void run() {
		for (int i = 0; i < vector.length; i++) {
			vector[i].getAndIncrement();
		}
	}

}

六、执行结果

ERROR :0
Exception in thread "Thread-200" Exception in thread "Thread-201" Exception in thread "Thread-202" Exception in thread "Thread-203" Exception in thread "Thread-204" Exception in thread "Thread-206" Exception in thread "Thread-205" Exception in thread "Thread-207" Exception in thread "Thread-208" Exception in thread "Thread-211" Exception in thread "Thread-212" Exception in thread "Thread-209" Exception in thread "Thread-214" Exception in thread "Thread-213" java.lang.NullPointerException
	at xyz.jangle.thread.test.n7_9.atomicarray.Decrementer2.run(Decrementer2.java:25)
	at java.base/java.lang.Thread.run(Thread.java:834)
java.lang.NullPointerException
	at xyz.jangle.thread.test.n7_9.atomicarray.Decrementer2.run(Decrementer2.java:25)
	at java.base/java.lang.Thread.run(Thread.java:834)
Exception in thread "Thread-229" java.lang.NullPointerException
	at xyz.jangle.thread.test.n7_9.atomicarray.Decrementer2.run(Decrementer2.java:25)
	at java.base/java.lang.Thread.run(Thread.java:834)
Exception in thread "Thread-230" java.lang.NullPointerException
	at xyz.jangle.thread.test.n7_9.atomicarray.Decrementer2.run(Decrementer2.java:25)
	at java.base/java.lang.Thread.run(Thread.java:834)
java.lang.NullPointerException
	at xyz.jangle.thread.test.n7_9.atomicarray.Decrementer2.run(Decrementer2.java:25)
	at java.base/java.lang.Thread.run(Thread.java:834)
java.lang.NullPointerException
	at xyz.jangle.thread.test.n7_9.atomicarray.Incrementer2.run(Incrementer2.java:24)
	at java.base/java.lang.Thread.run(Thread.java:834)
java.lang.NullPointerException
	at xyz.jangle.thread.test.n7_9.atomicarray.Incrementer2.run(Incrementer2.java:24)
	at java.base/java.lang.Thread.run(Thread.java:834)
java.lang.NullPointerException
	at xyz.jangle.thread.test.n7_9.atomicarray.Incrementer2.run(Incrementer2.java:24)
	at java.base/java.lang.Thread.run(Thread.java:834)
java.lang.NullPointerException
	at xyz.jangle.thread.test.n7_9.atomicarray.Decrementer2.run(Decrementer2.java:25)
	at java.base/java.lang.Thread.run(Thread.java:834)
java.lang.NullPointerException
	at xyz.jangle.thread.test.n7_9.atomicarray.Incrementer2.run(Incrementer2.java:24)
	at java.base/java.lang.Thread.run(Thread.java:834)
java.lang.NullPointerException
	at xyz.jangle.thread.test.n7_9.atomicarray.Incrementer2.run(Incrementer2.java:24)
	at java.base/java.lang.Thread.run(Thread.java:834)
Exception in thread "Thread-253" Exception in thread "Thread-255" java.lang.NullPointerException
	at xyz.jangle.thread.test.n7_9.atomicarray.Decrementer2.run(Decrementer2.java:25)
	at java.base/java.lang.Thread.run(Thread.java:834)
Exception in thread "Thread-252" Exception in thread "Thread-257" Exception in thread "Thread-254" Exception in thread "Thread-250" Exception in thread "Thread-251" Exception in thread "Thread-249" Exception in thread "Thread-245" java.lang.NullPointerException
	at xyz.jangle.thread.test.n7_9.atomicarray.Decrementer2.run(Decrementer2.java:25)
	at java.base/java.lang.Thread.run(Thread.java:834)
Exception in thread "Thread-265" Exception in thread "Thread-246" Exception in thread "Thread-247" java.lang.NullPointerException
	at xyz.jangle.thread.test.n7_9.atomicarray.Decrementer2.run(Decrementer2.java:25)
	at java.base/java.lang.Thread.run(Thread.java:834)
Exception in thread "Thread-248" Exception in thread "Thread-241" java.lang.NullPointerException
	at xyz.jangle.thread.test.n7_9.atomicarray.Decrementer2.run(Decrementer2.java:25)
	at java.base/java.lang.Thread.run(Thread.java:834)
Exception in thread "Thread-244" java.lang.NullPointerException
	at xyz.jangle.thread.test.n7_9.atomicarray.Incrementer2.run(Incrementer2.java:24)
	at java.base/java.lang.Thread.run(Thread.java:834)
Exception in thread "Thread-243" Exception in thread "Thread-238" Exception in thread "Thread-242" Exception in thread "Thread-240" java.lang.NullPointerException
	at xyz.jangle.thread.test.n7_9.atomicarray.Incrementer2.run(Incrementer2.java:24)
	at java.base/java.lang.Thread.run(Thread.java:834)
Exception in thread "Thread-225" Exception in thread "Thread-239" Exception in thread "Thread-237" java.lang.NullPointerException

ERROR2 :0

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值