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();
问题解决但是其中的道理自己却搞不懂了(打印控制台过程跟自己想的不一样结果却对了)