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