多线程访问同一个变量,不进行同步,会造成结果不一致。这里解决方案有很多,使用原子变量。加锁同步,使用synchronized同步。下面是一个lock demo,后面会分析lock实现原理。lock使用的是公平锁还是非公平锁等
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * Created by GuanXF on 2017/11/26. */ public class TestLock { private static Lock lock = new ReentrantLock(); private static int count = 0 ; // private static AtomicInteger count = new AtomicInteger(0); public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread(task); Thread t2 = new Thread(task1); t1.start(); t2.start(); t1.join(); t2.join(); System.out.println("count = " + count); } static Runnable task1 = new Runnable() { @Override public void run() { int index = 10000; while(index > 0){ lock.lock(); count++; lock.unlock(); // count.incrementAndGet(); index --; } } }; static Runnable task = new Runnable() { @Override public void run() { int index = 10000; while(index > 0){ lock.lock(); count++; lock.unlock(); // count.incrementAndGet(); index --; } } }; }