多线程 —— 使用代码显式加锁

来源:互联网 发布:java 集合框架详解 编辑:程序博客网 时间:2024/05/22 07:05

以前我们都是使用 synchronized 关键字来保证同步的。现在我们使用同步锁,使得同步的概念体现得更加清晰。

例:卖票程序

/** * Created by liwei on 16/7/18. * * 在这个线程的例子里,因为添加了同步锁, * 才得以保证买票的事情在三个线程里有序执行者。 * 这一点希望用心体会。 * * */public class SellTicket implements Runnable {    // 定义票数    private Integer 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();            }        }    }}

测试方法:

/** * Created by liwei on 16/7/18. * * 测试方法:加上线程锁和不加线程锁的区别。 * *//* * 虽然我们可以理解同步代码块和同步方法的锁对象问题,但是我们并没有直接看到在哪里加上了锁,在哪里释放了锁, * 为了更清晰的表达如何加锁和释放锁,JDK5以后提供了一个新的锁对象Lock。 * * Lock: *      void lock(): 获取锁。 *      void unlock():释放锁。 * ReentrantLock是Lock的实现类. */public class SellTicketDemo {    public static void main(String[] args) {        // 创建资源对象        SellTicket st = new SellTicket();        // 创建三个窗口        Thread t1 = new Thread(st,"win1");        Thread t2 = new Thread(st,"win2");        Thread t3 = new Thread(st,"win3");        // 启动线程        t1.start();        t2.start();        t3.start();    }}
0 0
原创粉丝点击