目 录CONTENT

文章目录

07_JUC_同步锁Lock

ByteNews
2019-08-26 / 0 评论 / 0 点赞 / 33,742 阅读 / 958 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-01-16,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

07_JUC_同步锁Lock

Lock同步锁

用于解决多线程安全问题的方式:

  1. 同步代码块(synchronized)【隐式锁】
  2. 同步方法(synchronized)【隐式锁】
  3. jdk1.5以后出现了一种更加灵活的方式:同步锁Lock【显式锁】,需要通过lock()方法进行上锁,相应的必须通过unlock()方法进行释放锁
public class TestLock {

    public static void main(String[] args) {
        Ticket ticket = new Ticket();
        new Thread(ticket,"1号窗口").start();
        new Thread(ticket,"2号窗口").start();
        new Thread(ticket,"3号窗口").start();
    }

}

class Ticket implements Runnable{
    private int tick = 100;

    private Lock lock = new ReentrantLock();

    private void ru(){
        while (tick>0){
            synchronized (this){
                try {
                    Thread.sleep(20);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName()+" : 完成售票,余票为"+(--tick));
            }
        }
    }

    public void run() {
//        ru();
        while (true){
            // 记住要先锁再判断tick是否>0,否则在while条件里判断的话,可能会导致出现负数
            lock.lock();
            try {
                if (tick>0) {
                    try {
                        Thread.sleep(20);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName()+" : 完成售票,余票为"+(--tick));
                }
            } finally {
                lock.unlock();
            }
        }
    }
}
0

评论区