多个线程同时拥有资源的情况,只需把公共资源设为唯一即可解决问题;
public static void main(String[] args) { //买票任务---同一个票池 TicketingTaskThread1 ticketingTaskThread1 = new TicketingTaskThread1(); Thread thread = new Thread(ticketingTaskThread1); Thread thread1 = new Thread(ticketingTaskThread1); thread.start(); thread1.start(); }
public class TicketingTaskThread1 implements Runnable { //竞争资源--车票池购票数量 //volatile保证了线程之间的可见性; //threadLocal保证了线程之间的不可见性 private static volatile int quanlity = 100; //为了保证线程安全性 AtomicInteger atomic = new AtomicInteger(quanlity); /** * 需要执行的任务 */ @Override public void run() { //当然也可以用ReteentLock或者synochronized去实现 //功能和volatile类似 while (atomic.get() > 0) { System.out.println("获取当前的售票的数量"+atomic.get()); atomic.getAndDecrement(); } }
每个Java对象都有且只有一个同步锁,在任何时刻,最多只允许一个线程拥有这把锁,当消费者线程试图执行以带有synchronized(this)标记的代码块时,消费者线程必需先获得this关键字引用的Stack对象的锁。