volatile
关键字只保证了元素的可见性,即对变量的修改各个线程都会立即得到修改后的值采用synchronized:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | public class Test { public int inc = 0 ; public synchronized void increase() { inc++; } public static void main(String[] args) { final Test test = new Test(); for ( int i= 0 ;i< 10 ;i++){ new Thread(){ public void run() { for ( int j= 0 ;j< 1000 ;j++) test.increase(); }; }.start(); } while (Thread.activeCount()> 1 ) //保证前面的线程都执行完 Thread.yield(); System.out.println(test.inc); } } |
采用Lock:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | public class Test { public int inc = 0 ; Lock lock = new ReentrantLock(); public void increase() { lock.lock(); try { inc++; } finally { lock.unlock(); } } public static void main(String[] args) { final Test test = new Test(); for ( int i= 0 ;i< 10 ;i++){ new Thread(){ public void run() { for ( int j= 0 ;j< 1000 ;j++) test.increase(); }; }.start(); } while (Thread.activeCount()> 1 ) //保证前面的线程都执行完 Thread.yield(); System.out.println(test.inc); } } |
采用AtomicInteger:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | public class Test { public AtomicInteger inc = new AtomicInteger(); public void increase() { inc.getAndIncrement(); } public static void main(String[] args) { final Test test = new Test(); for ( int i= 0 ;i< 10 ;i++){ new Thread(){ public void run() { for ( int j= 0 ;j< 1000 ;j++) test.increase(); }; }.start(); } while (Thread.activeCount()> 1 ) //保证前面的线程都执行完 Thread.yield(); System.out.println(test.inc); } } |