Java多线程知识点整理(二)---- 卖票案例
Java多线程知识点整理(二)
多线程—卖票案例
第一部分
public class Test05 implements Runnable{ //一共多少张票 private int ticket = 50; //创建Object对象 Object obj = new Object();
第二部分
public void run() { // TODO Auto-generated method stub while(true){ /** * * synchronized:同步代码块 该关键字 关键字可以用于方法中的某个区块中,表示只对这个区块的资源实行互斥访问。 * synchronized格式如下 * synchronized(同步锁){ * 需要同步操作的代码 * } **/ synchronized (obj) { if(ticket > 0){ try { Thread.sleep(1000); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"正在努力售票中,当前剩余"+(ticket--)+"张"); }else{ System.out.println("今天的票已售完,请明日再来!"); // Thread.currentThread().stop(); break; } } } }
第三部分
public static void main(String[] args) { Test05 t = new Test05(); Thread t1 = new Thread(t,"1号窗口"); Thread t2 = new Thread(t,"2号窗口"); Thread t3 = new Thread(t,"3号窗口"); t1.start(); t2.start(); t3.start(); } }
案例总结:
-
若是不使用synchronized,容易出现线程安全问题,一张票被卖了多次,或者票已经卖完,但是线程还是售票等情况 synchronized 线程实现同步,线程a在执行的时候,线程b和线程c都要等待 但是会影响性能 因此在使用synchronized代码块时 尽量套在核心代码上,不要套用太多无关的代码
下一篇:
用java简单写一个猜数字游戏