class Ticket implements Runnable { //1.描述票的数量 private int tickets = 100; //2.售票的动作,这个动作需要被多线程执行,那就是线程任务代码,需要定义run方法中 //线程任务中通常都有循环结构 private Object obj = new Object(); public void run() { /* //使用同步代码块解决多线程安全问题 synchronized(obj) { while (true) { if (tickets > 0) { System.out.println(Thread.currentThread().getName() + " "+ tickets--); } } } */ while(true) { this.sale(); } } //解决多线程安全问题第二种方式通过同步函数 /* 同步函数使用的锁是固定的this,当线程任务需要一个同步时可以使用同步函数 同步代码块使用的锁可以是任意一个对象,当线程任务需要多个同步时,必须通过锁来区分,这时只能使用同步代码块了 */ public synchronized void sale() { if (tickets > 0) { try{Thread.sleep(10);}catch(InterruptedException e){} System.out.println(Thread.currentThread().getName() + " "+ tickets--); } } } public class ThreadDemo3 { public static void main(String[] args) { //1.创建Runnable接口的子类对象 Ticket t = new Ticket(); //2创建4个线程对象,并将Runnable接口的子类对象作为参数传递给Thread的构造函数 Thread t1 = new Thread(t); Thread t2 = new Thread(t); Thread t3 = new Thread(t); Thread t4 = new Thread(t); //3.开启4个线程 t1.start(); t2.start(); t3.start(); t4.start(); } }