--1、创建一个不会将内存用完,可以循环的set:
package com.itcats.cn;
/**
* 这是一个循环set,该set有一个构造方法,传入一个set的大小值,会将set初始化为全部-1;
* 该set有一个同步的add方法和contains方法,且当set的容量超过其len时,会把它的开始元素给覆盖掉
* @author User Soft
*
*/
public class CircularSet {
private int[] array;
private int len;
private int index=0;
public CircularSet(int size){
array=new int[size];
len=size;
for (int i = 0; i < size; i++) {
array[i]=-1;
}
}
public synchronized void add(int i){
array[index]=i;
index=++index % len;
}
public synchronized boolean contains(int value ){
for(int i=0;i<len;i++){
if(array[i]==value) return true;
}
return false;
}
}
--2、
package com.itcats.cn;
public class SerialNumberGenerator {
/**
* 从0开始生成定增是整数返回
*/
private static int serialNumber=0;
/**
* 如果该方法不加锁,则多线程访问时可能会出现冲突:
* java的递增不是原子性的,它涉及一个读操作和一个写操作。
* 多线程访问时不安全的,当一个线程读取完成,但没有完成回写时,
* 另一个线程进行读操作,此时两个线程"加"操作后的值就是一样的。
* @return
*/
public static synchronized int nextSerialNumber(){
return serialNumber++;
}
--3、有一个内部类,用以检测这个set中是否有重复的元素。
package com.itcats.cn;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class SerialNumberChecker {
private static final int SIZE=10;
private static CircularSet serials=new CircularSet(1000);
private static ExecutorService exec = Executors.newCachedThreadPool();
/**
* 静态内部类**/
/**
* 静态内部类,开启线程将一个整数值加入大一个set中,该set是一个循环set且
* 其中的方法均是同步处理过的
* @author User Soft
*
*/
static class SerialChecker implements Runnable {
@Override
public void run() {
while(true){
int serial = SerialNumberGenerator.nextSerialNumber();
/**
* 不进行同步可能会输出:
* Duplicat :8349
* Duplicat :8350
*/
synchronized (SerialChecker.class) {
if(serials.contains(serial)){
System.out.println("Duplicat :"+serial);
System.exit(0);
}
serials.add(serial);
}
}
}
}
public static void main(String[] args) {
/** 开启10个线程,向这个循环set中加入递增的值 **/
for (int i = 0; i < SIZE; i++) {
exec.execute(new SerialChecker());
}
}
}