版权声明:本文为博主原创文章,未经博主允许不得转载。 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();
}
}