多线程抢票2

1.12306抢票 (线程 死锁)方法一:

public class ThreadGetOneResource
​
{
​
private int  ticket=1000;
public static void main(String[] args)
{
    //多个线程抢占同一个资源
    //所有的传值过程就是复制过程
    //静态只能访问静态
    ThreadGetOneResource one=new ThreadGetOneResource();
    for(int i=0;i<3;i++)
    {
        new Thread(){  //匿名内部类(不能访问外部类)
            public void run()
            {
                //加锁   某个线程  获得到锁   将它的代码全部都执行 执行完毕之后 才会释放锁 
                //1.必须是包装类型  2.全局只有一份
                while(true)
                {   
                    synchronized (one)
                    {
                    if(one.ticket<=0)
                    {
                        break;
                    }                       
                    System.out.println(Thread.currentThread().getName()+"ticket的数量是="+one.ticket);                      
                    one.ticket--;
                }
                    
                }
            }
                                
        }.start();
    }
}   
  }

2.12306抢票(抽取线程 死锁)方法二:

  public class ThreadGetOneResource2  extends Thread
​
{
​
public static TicketModel ticketModel=new TicketModel();
//锁的对象 不能是基本数据类型  基本数据类型的包装类也不行  一定是一个类对象
/**
 * public class TicketModel
 * {
 *   public  int  ticket=1000; 
 * }
 */
public void run()
{
    
  while(true)
  {
   synchronized (ticketModel)
   {
       if(ticketModel.ticket<=0)
       {
           break;
       }
    System.out.println(Thread.currentThread().getName()+"ticket="+ticketModel.ticket);
    ticketModel.ticket--;
    }         
  }
}
public static void main(String[] args)
{
    for(int i=0;i<=3;i++)
    {
        ThreadGetOneResource2 resource=new ThreadGetOneResource2();
        resource.start();
    }
}
}

3.方法三:

  public class TicketRunable3  implements Runnable
​
{
​
private  int  ticket=1000;  
public void run()
{
    while(true)
    {           
        dosomething();
    }   
}
​
//synchronized 其实就是this的写法
public synchronized void dosomething()
{
    if(ticket<=0)
    {
        System.exit(-1);
    }
    System.out.println(Thread.currentThread().getName()+"ticket="+ticket);
    ticket--;
}
​
public static void main(String[] args)
{
    TicketRunable3 ticketRun=new TicketRunable3();
    Thread t1=new Thread(ticketRun);
    Thread t2=new Thread(ticketRun);
    Thread t3=new Thread(ticketRun);
    Thread t4=new Thread(ticketRun);
    t1.start();
    t2.start();
    t3.start();
    t4.start();
}
}

4.方法四:

 public class TicketRunable2  implements Runnable
​
{
​
private  int  ticket=1000;
public void run()
{   
    while(true)
    {
        synchronized (this)//只有在Runnable接口中才能用this
        {
            if(ticket<=0)
            {
                break;
            }
            System.out.println(Thread.currentThread().getName()+"ticket="+ticket);
            ticket--;
        }           
    }   
}
​
public static void main(String[] args)
{
    TicketRunable2 ticketRun=new TicketRunable2();
    Thread t1=new Thread(ticketRun);
    Thread t2=new Thread(ticketRun);
    Thread t3=new Thread(ticketRun);
    Thread t4=new Thread(ticketRun);
    t1.start();
    t2.start();
    t3.start();
    t4.start();
}
}

#5.方法五:

    public class TicketRunable  implements Runnable
​
{
​
private  int  ticket=1000;
private Object obj=new Object();
public void run()
{   
    while(true)
    {
        synchronized (obj)//全局只有一份
        {
            if(ticket<=0)
            {
                break;
            }
            System.out.println(Thread.currentThread().getName()+"ticket="+ticket);
            ticket--;
        }           
    }   
}
​
public static void main(String[] args)
{
    TicketRunable ticketRun=new TicketRunable();
    Thread t1=new Thread(ticketRun);
    Thread t2=new Thread(ticketRun);
    Thread t3=new Thread(ticketRun);
    Thread t4=new Thread(ticketRun);
    t1.start();
    t2.start();
    t3.start();
    t4.start();
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值