JAVA线程_1_卖票

JAVA线程-1_卖票

讨论区

  • 这段代码是从博文上看来的,也算是自己刚开始看线程的启蒙代码
  • 下面是自己的测试点
    1. 如果不加synchronized对类进行同步块,那么就会使线程ABC同时获取到tickets数量,即同一时刻获取同一个tickets的内存数据(重复票
      这里写图片描述
    2. 待补充(我也不知道该讲什么)

代码区-1-synchronized

public class Demo1 {
    private int tickets = 100;
    void sell() {
        while (tickets > 0) {
            synchronized (this) {
                if (tickets > 0) {
                    System.out.println(Thread.currentThread().getName() + " "+ tickets);
                    tickets--;
                }
            }
            try {
                Thread.currentThread().sleep(500l);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        System.out.println(Thread.currentThread().getName() + " have sold out...");
    }

    public static void main(String[] args) {
        final Demo1 demo1 = new Demo1();
//      Thread sellA = new Thread(demo1::sell);// JDK8 new use
        Thread sellA = new Thread(new Runnable() {

            @Override
            public void run() {
                demo1.sell();
            }
        });
        sellA.setName("SellerA");
//      Thread sellB = new Thread(demo1::sell);// JDK8 new use
        Thread sellB = new Thread(new Runnable() {

            @Override
            public void run() {
                demo1.sell();
            }
        });
        sellB.setName("SellerB");
//      Thread sellC = new Thread(demo1::sell);// JDK8 new use
        Thread sellC = new Thread(new Runnable() {

            @Override
            public void run() {
                demo1.sell();
            }
        });
        sellC.setName("SellerC");

        sellA.start();
        sellB.start();
        sellC.start();
    }
}

代码区-2-ReentrantLock

package tmp1;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Demo1 {
    private int tickets = 100;
    private Lock lock = new ReentrantLock();
    void sell() {
        while (tickets > 0) {
            lock.lock();
            try {
                if (tickets > 0) {
                    System.out.println(Thread.currentThread().getName() + " "+ tickets);
                    tickets--;
                }
            } catch (Exception e) {
                // TODO: handle exception
            }finally{
                lock.unlock();
            }


            try {
                Thread.currentThread().sleep(500l);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
        System.out.println(Thread.currentThread().getName() + " have sold out...");
    }

    public static void main(String[] args) {
        final Demo1 demo1 = new Demo1();
//      Thread sellA = new Thread(demo1::sell);// JDK8 new use
        Thread sellA = new Thread(new Runnable() {

            @Override
            public void run() {
                demo1.sell();
            }
        });
        sellA.setName("SellerA");
//      Thread sellB = new Thread(demo1::sell);// JDK8 new use
        Thread sellB = new Thread(new Runnable() {

            @Override
            public void run() {
                demo1.sell();
            }
        });
        sellB.setName("SellerB");
//      Thread sellC = new Thread(demo1::sell);// JDK8 new use
        Thread sellC = new Thread(new Runnable() {

            @Override
            public void run() {
                demo1.sell();
            }
        });
        sellC.setName("SellerC");

        sellA.start();
        sellB.start();
        sellC.start();
    }
}

运行截图区

这里写图片描述

猜你喜欢

转载自blog.csdn.net/Aimu_Zs/article/details/80568012