使用Lock解决线程安全问题

使用Lock解决线程安全问题

Lock接口

Lock接口的概述
    * Lock是JDK1.5新特性 
    * 专门用来实现线程安全的技术
    
Lock接口的常用实现类
    * ReentrantLock:互斥锁
    
Lock接口的常用方法
    void lock()  获取锁
    void unlock() 释放锁

注意事项
    * 获取锁和释放锁的代码必须成对出现。
  • 示例代码

public class TicketThread extends Thread {
    // 定义变量记录总票数
    private static int tickets = 100;
    // 创建互斥锁对象
    private static Lock lockObj = new ReentrantLock();

    @Override
    public void run() {
        // 使用循环保证票能够被卖完
        while (true) {
            try {
                // 模拟休眠
                Thread.sleep(500);
                // 获取锁
                lockObj.lock();
                // 开始卖票
                if (tickets > 0) {
                    // 卖一张
                    System.out.println(this.getName() + " 卖了一张票,还剩 " + (--tickets) + " 张");
                    continue;
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                // 释放锁
                lockObj.unlock();
            }
            System.out.println("票没了...");
            break;
        }
    }
}

public static void main(String[] args) {
    TicketThread t1=new TicketThread();
    TicketThread t2=new TicketThread();
    TicketThread t3=new TicketThread();
    t1.start();
    t2.start();
    t3.start();
}

Lock和synchronized区别?

  • synchronized是一个关键字,Lock是一个接口,是JDK1.5新特性.

  • synchronized代码块执行完成之后会自动释放锁对象,Lock必须手动调用方法释放锁对象。

  • synchronized代码块出现了异常也会自动释放锁对象,Lock接口中出现异常也需要手动释放锁对象。

  • 如果资源竞争不激烈时,使用synchronized或Lock接口的效率差不多,如果资源竞争很激烈,强烈推荐使用Lock接口。

你可能感兴趣的:(java基础)