案例:4个售票窗口,同时售卖票,卖出去的票的数据要同步。不可以同时售卖同一张票。
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class Therad { //线程同步 public static void main(String[] args) { TicketThread ticketThread = new TicketThread(); Thread t1 = new Thread(ticketThread); Thread t2 = new Thread(ticketThread); Thread t3 = new Thread(ticketThread); Thread t4 = new Thread(ticketThread); t1.start(); t2.start(); t3.start(); t4.start(); } static class TicketThread implements Runnable { private int ticketNum = 10; // private Object obj=new Object(); @Override public void run() { while (true) { // synchronized (this) { // if (ticketNum > 0) { // System.out.println(Thread.currentThread().getName() + ":" + ticketNum); // try { // Thread.sleep(500); // } catch (InterruptedException e) { // e.printStackTrace(); // } // ticketNum--; // } else { // break; // } // } ticket(); } } private synchronized void ticket() { if (ticketNum > 0) { System.out.println(Thread.currentThread().getName() + ":" + ticketNum); try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } ticketNum--; } } Lock lock = new ReentrantLock();//创建锁对象 private void ticketLock(){ // lock.lock();//加锁 if (lock.tryLock()) { try { if (ticketNum > 0) { System.out.println(Thread.currentThread().getName() + ":" + ticketNum); try { Thread.sleep(500); } catch (IndexOutOfBoundsException e) { e.printStackTrace(); } ticketNum--; } } catch (Exception e) { e.printStackTrace(); } finally { lock.unlock(); } } //lock.unlock();//释放锁 } } }