黑马程序员技术交流社区

标题: 两种同步锁synchronize和Lock的分析 [打印本页]

作者: 新晋猿工    时间: 2016-5-29 20:44
标题: 两种同步锁synchronize和Lock的分析
电影院卖票程序:
        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();
                }
        }
       


作者: likonglin110    时间: 2016-5-29 20:57
来抢沙发了
作者: Kingchen    时间: 2016-5-29 22:19
顶一个!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2