A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

电影院卖票程序:
        a、同步锁synchronized
                用同步锁解决多线程的两个问题:
                出现重复数:CPU的一次操作必须是原子性的
                出现负数:随机性和延迟导致的
        public class SellTicket implements Runnable {
                // 定义100张票
                private int tickets = 100;
                //创建锁对象
                private Object obj = new Object();
               
                @Override
                public void run() {
                        while (true) {
                                synchronized (obj) {
                                        if (tickets > 0) {
                                                try {
                                                        Thread.sleep(100);
                                                } catch (InterruptedException e) {
                                                        e.printStackTrace();
                                                }
                                                System.out.println(Thread.currentThread().getName()
                                                                + "正在出售第" + (tickets--) + "张票");
                                        }
                                }
                        }
                }
        }
       
        public class SellTicketDemo {
                public static void main(String[] args) {
                        // 创建资源对象
                        SellTicket st = new SellTicket();

                        // 创建三个线程对象
                        Thread t1 = new Thread(st, "窗口1");
                        Thread t2 = new Thread(st, "窗口2");
                        Thread t3 = new Thread(st, "窗口3");

                        // 启动线程
                        t1.start();
                        t2.start();
                        t3.start();
                }
        b、同步锁Lock
                虽然我们可以理解同步代码块和同步方法的锁对象问题,但是我们并没有直接看到在哪里加上了锁,在哪里释放了锁,
                为了更清晰的表达如何加锁和释放锁,JDK5以后提供了一个新的锁对象Lock。
        public class SellTicket implements Runnable {

                // 定义票
                private int tickets = 100;

                // 定义锁对象
                private Lock lock = new ReentrantLock();

                @Override
                public void run() {
                        while (true) {
                                try {
                                        // 加锁
                                        lock.lock();
                                        if (tickets > 0) {
                                                try {
                                                        Thread.sleep(100);
                                                } catch (InterruptedException e) {
                                                        e.printStackTrace();
                                                }
                                                System.out.println(Thread.currentThread().getName()
                                                                + "正在出售第" + (tickets--) + "张票");
                                        }
                                } finally {
                                        // 释放锁
                                        lock.unlock();
                                }
                        }
                }
        }
       
        public class SellTicketDemo {
                public static void main(String[] args) {
                        // 创建资源对象
                        SellTicket st = new SellTicket();

                        // 创建三个线程对象
                        Thread t1 = new Thread(st, "窗口1");
                        Thread t2 = new Thread(st, "窗口2");
                        Thread t3 = new Thread(st, "窗口3");

                        // 启动线程
                        t1.start();
                        t2.start();
                        t3.start();
                }
        }
       

2 个回复

倒序浏览
来抢沙发了
回复 使用道具 举报
顶一个!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马