代码如下: public class TicketDemo implements Runnable { private static volatile AtomicInteger ticketSum = new AtomicInteger(20); private static int finalTotal = 0; @Override public void run() { int count; while ((count = ticketSum.decrementAndGet()) >= 0) { System.out.println(Thread.currentThread().getName() + "卖出了第" + ++count + "张票"); finalTotal++; } } public static void main(String[] args) { Thread t1 = new Thread(new TicketDemo(), "t1"); Thread t2 = new Thread(new TicketDemo(), "t2"); Thread t3 = new Thread(new TicketDemo(), "t3"); long startTime = System.currentTimeMillis(); t1.start(); t2.start(); t3.start(); while (true) { if (!t1.isAlive() && !t2.isAlive() && !t3.isAlive()) { long endTime = System.currentTimeMillis(); System.out.println("最终售出:" + finalTotal); System.out.println("最终耗时:" + (endTime - startTime) + "毫秒."); break; } } } }
总结:
多线程必须加上synchronized,保证不会出现并发线程同时访问的情况,而在AtomicInteger中却不用加上synchronized,AtomicInteger是一个提供原子操作的Integer类,通过线程安全的方式操作加减,AtomicInteger是在使用非阻塞算法实现并发控制,在一些高并发程序中非常适合,但并不能每一种场景都适合,不同场景要使用使用不同的数值类。
以上为AtomicInteger中的部分源码,在这里说下其中的value,这里value使用了volatile关键字,volatile在这里可以做到的作用是使得多个线程可以共享变量,但是问题在于使用volatile将使得VM优化失去作用,导致效率较低,所以要在必要的时候使用,因此AtomicInteger类不要随意使用,要在使用场景下使用。
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。