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();
}
}