package com.jvm.cas;
import org.junit.Test;
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicStampedReference;
/**
* Created by ZhouChenmin on 2018/3/24.
*/
public class AtomicStampedReferenceTest {
@Test
public void simpleTest(){
Integer initRef = 1;
Integer initStem = 1;
AtomicStampedReference<Integer> data = new AtomicStampedReference(initRef,initStem);
boolean ok = data.compareAndSet(1,2,1,2);
System.out.println(ok);
ok = data.compareAndSet(2,3,data.getStamp(),data.getStamp() + 1);
System.out.println(ok);
System.out.println(data.getReference());
}
@Test
public void concurrentTest() throws InterruptedException {
int initRef = 1;
int initStem = 1;
final AtomicStampedReference<Integer> data = new AtomicStampedReference(initRef,initStem);
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(5, 5, 5, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(),
new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
Thread thread = new Thread(r);
thread.setDaemon(false);
return thread;
}
});
int threadSize = 5;
final CountDownLatch countDownLatch = new CountDownLatch(threadSize);
for (int i = 1 ;i <= threadSize ; i ++){
threadPoolExecutor.execute(new Runnable() {
@Override
public void run() {
try {
for (int j =0 ;j < 100 ; j ++){
incr(data);
}
}finally {
System.out.println(Thread.currentThread().getName() + " has done the job");
countDownLatch.countDown();
}
}
});
}
try {
countDownLatch.await(10,TimeUnit.SECONDS);
} catch (InterruptedException e) {
}
System.out.println(countDownLatch.getCount());
if (countDownLatch.getCount() > 0){
System.out.println("依旧有线程在跑" + countDownLatch.getCount());
}
System.out.println(data.getReference());
System.out.println(data.getStamp());
/**
* 既然还有线程没有跑完,并且也不是守护线程,为什么程序就结束了????????????????
*/
}
public void incr (final AtomicStampedReference<Integer> data){
int mexRetry = 0;
while (true){
int value = data.getReference();
int stamp = data.getStamp();
if ( !data.compareAndSet(value , value+1 , stamp , stamp+1) ) {
mexRetry++;
}else {
return;
}
if (mexRetry > 20){
//throw new RuntimeException("retry count reach");
try {
Thread.sleep(1000);
mexRetry= 0;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
/**
* testIncr
*/
@Test
public void testIncr (){
int initRef = 1;
int initStem = 1;
final AtomicStampedReference<Integer> data = new AtomicStampedReference(initRef,initStem);
incr(data);
incr(data);
System.out.println(data.getReference());
System.out.println(data.getStamp());
}
}
期望输出501,结果输出128,请找出程序BUG,提示BUG在incr方法中。
运行junit test concurrentTest()