《Think in java》多线程学习理解-01

--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());
   }
  }    
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值