1.0 synchronized
/** * @ClassName Question11 * @Description: 經典多線程問題-多線程售票 * @Author xtanb * @Date 2019/10/22 * @Version V1.0 **/ class Ticket{ private int num = 300; public synchronized void sales(){ if(num>0){ System.out.println(Thread.currentThread().getName()+"賣出了第"+ num-- +"張票,"+"剩余"+num+"張票"); } } } public class Question11 { public static void main(String[] args) { Ticket ticket = new Ticket(); new Thread(()->{ for(int i=0;i<100;i++){ ticket.sales(); } },"A").start(); new Thread(()->{ for(int i=0;i<100;i++){ ticket.sales(); } },"B").start(); new Thread(()->{ for(int i=0;i<100;i++){ ticket.sales(); } },"C").start(); } }
2.0 ReentrantLock
package com.example.demo.study.questions; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * @ClassName Question12 * @Description: TODO * @Author xtanb * @Date 2019/10/22 * @Version V1.0 **/ class Tickets{ private int num = 300; private Lock lock = new ReentrantLock(); public void sales(){ try{ lock.lock(); if(num>0){ System.out.println(Thread.currentThread().getName()+"賣出了第"+ num-- +"張票,"+"剩余"+num+"張票"); } }catch (Exception e){ e.printStackTrace(); }finally { lock.unlock(); } } } public class Question12 { public static void main(String[] args) { Tickets tickets = new Tickets(); new Thread(()->{ for(int i=0;i<100;i++){ tickets.sales(); } },"A").start(); new Thread(()->{ for(int i=0;i<100;i++){ tickets.sales(); } },"B").start(); new Thread(()->{ for(int i=0;i<100;i++){ tickets.sales(); } },"C").start(); } }