java 完全非锁并发容器实现

    技术2025-09-06  76

    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();

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

     

    最新回复(0)