代码如下:
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;
}
}
}
}

AtomicInteger使用非阻塞算法,实现并发控制多线程实现售票_线程安全

AtomicInteger使用非阻塞算法,实现并发控制多线程实现售票_非阻塞_02

AtomicInteger使用非阻塞算法,实现并发控制多线程实现售票_System_03

总结:

多线程必须加上synchronized,保证不会出现并发线程同时访问的情况,而在AtomicInteger中却不用加上synchronized,AtomicInteger是一个提供原子操作的Integer类,通过线程安全的方式操作加减,AtomicInteger是在使用非阻塞算法实现并发控制,在一些高并发程序中非常适合,但并不能每一种场景都适合,不同场景要使用使用不同的数值类。

AtomicInteger使用非阻塞算法,实现并发控制多线程实现售票_线程安全_04

以上为AtomicInteger中的部分源码,在这里说下其中的value,这里value使用了volatile关键字,volatile在这里可以做到的作用是使得多个线程可以共享变量,但是问题在于使用volatile将使得VM优化失去作用,导致效率较低,所以要在必要的时候使用,因此AtomicInteger类不要随意使用,要在使用场景下使用。