1.两个原子操作组合到一块不一定是能保证原子性
ConcurrentLinkedQueue
AtomicInteger 两个类都为线程安全的类,但是组合起来并不能保证原子性:
public static ConcurrentLinkedQueue concurrentLinkedQueue = new ConcurrentLinkedQueue();public static AtomicInteger atomicInteger =new AtomicInteger();public boolean put (Object object){if("1000".equals(String.valueOf(atomicInteger))){System.out.println("队列已满");return false;}try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}concurrentLinkedQueue.add(object);atomicInteger.incrementAndGet();return true;}public Object get(){if("0".equals(String.valueOf(atomicInteger)))return null;Object poll = concurrentLinkedQueue.remove();atomicInteger.decrementAndGet();return poll;}public static void main(String[] args) {ThreadPoolExecutor threadPool = new ThreadPoolExecutor(2, 4, 3, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(3),new ThreadPoolExecutor.DiscardOldestPolicy());Centor centor = new Centor();for(int i=0;i<3;i++){threadPool.execute(new Runnable() {@Overridepublic void run() {int i=0;while (true){centor.put(i++);System.out.println(Thread.currentThread().getName()+"数量"+atomicInteger);}}});}
....
pool-1-thread-2数量967
pool-1-thread-1数量967
pool-1-thread-2数量969
pool-1-thread-1数量969
pool-1-thread-2数量971
pool-1-thread-1数量971
pool-1-thread-2数量973
pool-1-thread-1数量973
pool-1-thread-2数量975
pool-1-thread-1数量975
pool-1-thread-1数量977
pool-1-thread-2数量977
pool-1-thread-1数量978
pool-1-thread-2数量979
pool-1-thread-1数量980
pool-1-thread-2数量981
pool-1-thread-1数量983
pool-1-thread-2数量983
pool-1-thread-1数量985
pool-1-thread-2数量985
pool-1-thread-1数量986
pool-1-thread-2数量987
pool-1-thread-2数量989
pool-1-thread-1数量989
pool-1-thread-1数量991
pool-1-thread-2数量991
pool-1-thread-1数量992
pool-1-thread-2数量993
pool-1-thread-2数量994
pool-1-thread-1数量995
pool-1-thread-1数量997
pool-1-thread-2数量997
pool-1-thread-2数量999
pool-1-thread-1数量999
pool-1-thread-2数量1001
pool-1-thread-1数量1001
pool-1-thread-2数量1003
pool-1-thread-1数量1003
pool-1-thread-1数量1004
pool-1-thread-2数量1005
....