大型分布式网站架构(三)多线程操作原子性

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lwl2014100338/article/details/81907533
非原子性操作导致多线程Bug
package com.lwl.ldwa;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @author liuweilong
 * @ClassName: Count
 * @Description: 多线程bug案例
 * @Date 2018-08-21 14:07
 * @Version 1.0
 **/
public class Count {
    public  int count=0;

    static class Job implements Runnable{
        private CountDownLatch countDown;
        private Count count;

        public Job(Count count, CountDownLatch countDown) {
            this.count = count;
            this.countDown = countDown;
        }

        @Override
        public void run() {
           count.count++;
           countDown.countDown();
        }
    }

    public static void main(String[] args) throws InterruptedException {
       CountDownLatch countDown= new CountDownLatch(1500);
       Count count= new Count();
       ExecutorService ex= Executors.newFixedThreadPool(5);
        for (int i = 0; i <1500 ; i++) {
            ex.execute(new Job(count,countDown));
        }
        countDown.await();
        System.out.println(count.count);
        ex.shutdown();

    }
}

JDK提供的原子变量实现多线程操作
package com.lwl.ldwa.page4;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * @author liuweilong
 * @ClassName: AtomicCount
 * @Description: CAS原子操作实现线程安全
 * @Date 2018-08-21 14:27
 * @Version 1.0
 **/
public class AtomicCount {
    public AtomicInteger count=new AtomicInteger(0);

    static class Job implements Runnable{
        private AtomicCount count;
        private CountDownLatch countDown;

        public Job(AtomicCount count, CountDownLatch countDown) {
            this.count = count;
            this.countDown = countDown;
        }

        @Override
        public void run() {
         boolean isSuccess=false;
         while (! isSuccess){
             int countValue=count.count.get();
              isSuccess=count.count.compareAndSet(countValue,countValue+1);
         }
         countDown.countDown();
        }
    }

    public static void main(String[] args) throws InterruptedException {
      CountDownLatch countDown=  new CountDownLatch(1500);
      AtomicCount count= new AtomicCount();
        ExecutorService ex= Executors.newFixedThreadPool(5);
        for (int i = 0; i <1500 ; i++) {
            ex.execute(new Job(count,countDown));
        }
        countDown.await();
        System.out.println(count.count.get());
        ex.shutdown();
    }
}

猜你喜欢

转载自blog.csdn.net/lwl2014100338/article/details/81907533