创建多线程继承Thread和实现Runnable以及synchronized的注意事项

发布时间 2023-08-27 09:07:31作者: 士多PL

关于创建多线程继承Thread和实现Runnable以及synchronized的注意事项

  1. 以下是利用多线程模拟购票的代码

    public class Sell {
        public static void main(String[] args) {
            Ticket ticket = new Ticket();
            Ticket ticket1 = new Ticket();
            ticket.start();
            ticket1.start();
            Ticket2 ticket21 = new Ticket2();
            new Thread(ticket21, "小红").start();
            new Thread(ticket21, "小蓝").start();
        }
    }
    
    class Ticket extends Thread {
        private static int num = 100;
        private static Object Ticket = new Object();
    
        @Override
        public void run() {
            synchronized (Ticket) {
                while (true) {
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    if (num == 0) {
                        break;
                    }
                    if (num <= 100 && num > 0) {
                        System.out.println(Thread.currentThread().getName() + "maile" + num--);
                    }
                }
            }
    
        }
        class Ticket2 implements Runnable {
        private int num = 100;
        boolean loop = true;
    
        @Override
        public void run() {
            while (loop) {
                sell();
            }
        }
    
        public synchronized void sell() {
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if (num == 0) {
                loop = false;
                return;
            }
            if (num <= 100 && num > 0) {
                System.out.println(Thread.currentThread().getName() + "maile" + num--);
            }
        }
    }
    
  2. 在继承Thread方法下,想实现多线程抢票,票数要设置成静态属性(随着类加载而加载),因为要让创建实例化出来的对象都访问的是同一个票数。

  3. synchronized关键字标志的代码块来实现同一时间只有一个线程可以访问同一个对象,本质上是和对象上的“互斥锁”联系,获取对象上的互斥锁的过程,

    synchronized修饰非静态同步方法时,对象是This或者是其他同一对象,比如,上面的继承Thread方法的Object Ticket,修饰静态同步方法时,对象是当前类本身(Ticket.class)。