代码如下:
public class TicketDemo implements Runnable {private static volatile AtomicInteger ticketSum = new AtomicInteger(20);private static int finalTotal = 0;@Overridepublic 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类不要随意使用,要在使用场景下使用。