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简单写一个猜数字游戏
