問題分析:正如i在多線程中如果想實現i的多線程操作,必須i要使用volitle來保證其內存可見性,但是i++自增操作不具備原子性操作,因此需要對i++這段代碼確保其原子性操作即可。
方案1:
使用ReetranLock實現i++的原子性操作。
private static volatile int i=0; public static void main(String[] args) throws InterruptedException { CountDownLatch countDownLatch=new CountDownLatch(2); Lock lock=new ReentrantLock(); Thread thread1 = new Thread(new Runnable() { @Override public void run() { try{ lock.lock(); i++; }finally{ lock.unlock(); countDownLatch.countDown(); } } },"Thread-1"); Thread thread2 = new Thread(new Runnable() { @Override public void run() { try{ lock.lock(); i++; }finally{ lock.unlock(); countDownLatch.countDown(); } } },"Thread-2"); thread1.start(); thread2.start(); countDownLatch.await(); System.out.println(i); }
方案2:
使用Semaphore實現i++的原子性操作。
private static volatile int i = 0; public static void main(String[] args) throws InterruptedException { CountDownLatch countDownLatch = new CountDownLatch(2); Semaphore semaphore = new Semaphore(1); Thread thread1 = new Thread(new Runnable() { @Override public void run() { try { semaphore.acquire(); } catch (InterruptedException e) { e.printStackTrace(); } i++; semaphore.release(); countDownLatch.countDown(); } }, "Thread-1"); Thread thread2 = new Thread(new Runnable() { @Override public void run() { try { semaphore.acquire(); } catch (InterruptedException e) { e.printStackTrace(); } i++; semaphore.release(); countDownLatch.countDown(); } }, "Thread-2"); thread1.start(); thread2.start(); countDownLatch.await(); System.out.println(i); }
當然也可以選擇sychronized方式實現。