快捷搜索: 王者荣耀 脱发

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代码块时 尽量套在核心代码上,不要套用太多无关的代码
经验分享 程序员 微信小程序 职场和发展