java 多线程(死锁)第二种实现方式+买票实例

  • 死锁:当多个线程,相互等待对方释放锁的时候,但是锁对象又不是自己,出现相互等待的状态
    *
    * 举例:吃饭案例
    * 美国人吃饭:一个刀,一个叉
    * 中国人吃饭:一双筷子
    *
    * 正常情况:
    * 美国人左手刀,右手叉
    * 中国一双筷子
    * 异常情况
    * 美国人,左手刀,右手一只筷子
    * 中国人,一只筷子,一只叉
    *
    * 一直僵持,出现相互等待的状态…
    *
    * 死锁案例
    * 2个线程,2把锁
    *
    * 阻塞有2个状态
    * 1:sleep
    * 2:wait
    * 线程通信可以解决线程相互等待…
    * 死锁是指两个或两个以上的进线程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞(等待)的现象,
    * 若无外力(唤醒)作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的线程称为死锁线程。

public class Demo {

	public static void main(String[] args) {
		
		//1:2个线程
		DieLock d1 = new DieLock(true);
		DieLock d2 = new DieLock(false);
		
		//2:启动线程
		d1.start();
		d2.start();
			
	}

}


public class DieLock extends Thread {
	
	private static Object objA = new Object();  //锁1
	private static Object objB = new Object();  //锁2
	
	
	private boolean flag = true;  //初始值
	
	public DieLock(boolean flag) {
		this.flag = flag;
	}
	@Override
	public void run() {
		
		if(flag){
			/*try {
				Thread.sleep(1L);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}*/
			synchronized (objA) {
				System.out.println("if ObjA");
				synchronized (objB) {
					System.out.println("if ObjB");
				}
			}
			
		}else{
			synchronized (objB) {
				System.out.println("else ObjB");
				synchronized (objA) {
					System.out.println("else ObjA");
				}
			}
		}
	   
	}


	
}

多线程的实现方式2

  • 实现多线程的方案
    * 1:继承Thread类,重写run方法
    * 2:实现Runnable接口,重写run方法
    *
    * 2种方案的优缺点
    * 2.1 :继承方案的优点:书写简单,缺点是耦合性太高
    * 2.2:接口方案的优点:降低类与类的耦合性,缺点是书写复杂

public class Demo {
	public static void main(String[] args) {
		
		//1:创建1个实现类的对象
		MyRunn m = new MyRunn();
		//2:创建2个多线程
		Thread t1 = new Thread(m);
		Thread t2 = new Thread(m);
		//3:起名
		t1.setName("线程1");
		t2.setName("线程2");
		//4:启动线程
		t1.start();
		t2.start();
		
	}

}

public class MyRunn implements Runnable {

	@Override
	public void run() {
	 
	System.out.println(Thread.currentThread().getName()+"我可以执行吗");	
		
	}

}

多线程实现卖票

public class Demo {
	
	/*
	 * 多线程实现买票
	 * 
	 * 通过接口方案
	 *  1:票数不用加static
	 *  2:锁不需要专门new一个静态对象,直接使用this即可
	 *  3:线程名称不能为null
	 *  4:共享资源对象不能为null 
	 * 
	 */
	public static void main(String[] args) {
		//1:创建1个资源共享类
		SellTickets s  = new SellTickets();
		
		//2:创建3个窗口多线程,并且给多线程起名
		Thread t1 = new Thread(s, "窗口1");
		Thread t2 = new Thread(s, "窗口2");
		Thread t3 = new Thread(s, "窗口3");
		
		//3:启动多线程
		t1.start();
		t2.start();
		t3.start();
		
		
		
		
	}

}


import java.util.Vector;

public class SellTickets implements Runnable {
	
	 int tickets = 100;
	 
	 public synchronized void sellTickets(){
		
				if(tickets>0){
					//模拟真实的买票。需要一定的延迟
					try {
						Thread.sleep(100L);
System.out.println(Thread.currentThread().getName()+"正在出售第"+(tickets--)+"张票");
						
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					
				}
			
		 
	 }

	@Override
	public void run() {
		//模拟电影院一直售票
		while(true){
			sellTickets();
			
			/*synchronized(this){
				if(tickets>0){
					//模拟真实的买票。需要一定的延迟
					try {
						Thread.sleep(100L);
	
		System.out.println(Thread.currentThread().getName()+"正在出售第"+(tickets--)+"张票");
						
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					
				}
			}*/
			
			
		}
		
		
	}

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值