现在的位置: 首页 > 综合 > 正文

java 完全非锁并发容器实现

2017年12月06日 ⁄ 综合 ⁄ 共 2286字 ⁄ 字号 评论关闭

public class CompareAndSet {
 public static void main(String [] args) {
  Threadmin th = new Threadmin();
  new Thread(th, "1号窗口").start(); 
  new Thread(th, "2号窗口").start();
  new Thread(th, "3号窗口").start();
  new Thread(th, "4号窗口").start();
  Threadmin2 a = new Threadmin2();
  new Thread(a, "7号窗口").start(); 
 }
}

 

public class Threadmin implements Runnable{
    int i =0;
 public void run() {
     while(i<30){
      Char r = new Char();
   int b = i++;
   r.setFlag(b);
   r.setMessage("世界"+b);
   ChatContainer.getInstance().addMessage(r);
  }
     try {
   Thread.sleep(400);
  } catch (InterruptedException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }

}

 

public class Threadmin2 implements Runnable{
 public void run() {
     while(true){
      try {
    Thread.sleep(1000);
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   System.out.println("容器:"+ChatContainer.getInstance().getAll().size());
      Iterator iter = ChatContainer.getInstance().getAll().entrySet().iterator();
      while (iter.hasNext()) {
      Map.Entry entry = (Map.Entry) iter.next();
      Object key = entry.getKey();
      Object val = entry.getValue();
      Char r = (Char)val;
      System.out.println(key+":"+r.getMessage());
      }
     }
    
 }
}

 

public class ChatContainer {
 static int capacity = 30;
 final private static AtomicInteger counter = new AtomicInteger(0);
 final private static ConcurrentHashMap<Integer, Char> map = new ConcurrentHashMap<Integer, Char>(capacity);
 private static ChatContainer instance = new ChatContainer();
 public ChatContainer(){}
 public static ChatContainer getInstance(){
  return instance;
    }
   
 public void addMessage(Char Char){
  System.out.println(Thread.currentThread().getName()+"A>>>>>>"+counter.get());
  counter.getAndIncrement();
  System.out.println(Thread.currentThread().getName()+"B>>>>>>"+counter.get());
  int count = counter.get();
  if(count>capacity){
   counter.lazySet(0);
   count =1;
  }
     map.put(count-1, Char);
     System.out.println(counter.get()+"((((((((((((((((((((((");
 }
 
 public int getint(){
  return counter.get();
 }
 public ConcurrentHashMap getAll(){
  return map;
 }

大家自己理解吧 嘿嘿

大问题 如果在 counter.getAndIncrement(); 加上线程等待又会有问题

try {
    Thread.sleep(2500);
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }

还是有线程闯入的机会

修改》》》》》》》》》》》》》》》》

int count = counter.getAndIncrement();

问题解决但是其中的道理自己却搞不懂了(打印控制台过程跟自己想的不一样结果却对了)

 

抱歉!评论已关闭.