为了账号安全,请及时绑定邮箱和手机立即绑定

synchronized和Lock

标签:
Java
  1. synchronized是关键字Lock是一个类。

  2. synchronized是个全自动会自动释放锁 Lock是手动的 。

  3. synchronized无法判断获取锁的状态Lock可以判断。

  4. synchronized 线程1 (获得锁, 阻塞了) 线程2 (等待, 一直等) Lock锁就不一定会一直等下去
    会有locak.tryLock() 尝试获取锁。

  5. synchronized 可重入锁,不可中断 , 非公平 ; Lock 可重入锁,可以判断锁, 默认非公平(可以自己设置)。

  6. synchronized 适合锁少量的同步代码, Lock适合锁大量的同步代码。

  7. synchronized 可以锁代码块和方法, Lock只能锁代码块。

  8. 使用Lock锁JVM将花费较少的时间来调度线程,性能更好, 并且可扩展性好 有更多的子类。

Lock分为三部分

  1. ReentrantLock() 可重入锁
  2. ReentrantReadWriteLock.ReadLock() 读锁
  3. ReentrantReadWriteLock.WriteLock() 写锁
    public ReentrantLock() {
        sync = new NonfairSync();
    }

    /**
     * Creates an instance of {@code ReentrantLock} with the
     * given fairness policy.
     *
     * @param fair {@code true} if this lock should use a fair ordering policy
     */
    public ReentrantLock(boolean fair) {
        sync = fair ? new FairSync() : new NonfairSync();
    }

这里是可重入锁 ReentrantLock() 的源码

不传参数的时候默认是非公平锁=============》不按顺序来的 可插队
传参是true时候是公平锁,false时候是非公平锁 =========》 完全按照顺序执行 存在3s的进程等到3h的进程

写法上区别

synchronized

/**
 * 注释
 *
 * @author sunhao
 * @Date 2021-08-23-21:11
 */
public class Test01 {

    public static void main(String[] args) {
        Book book = new Book();

        new Thread(() -> { for (int i = 0; i < 60; i++) book.sell(); }, "A").start();
        new Thread(() -> { for (int i = 0; i < 60; i++) book.sell(); }, "B").start();
        new Thread(() -> { for (int i = 0; i < 60; i++) book.sell(); }, "C").start();
    }
}


class Book{
    int num = 60;
    public synchronized void sell(){
        if (num > 0)
        System.out.println(Thread.currentThread().getName()+"卖出了第" + (num--)+ "本剩余" + num + "本");
    }

//    Lock lock = new ReentrantLock();
//    public void sell(){
//        lock.lock();
//        try {
//            if (num > 0)
//                System.out.println(Thread.currentThread().getName()+"卖出了第" + (num--)+ "本剩余" + num + "本");
//        } catch (Exception e) {
//            e.printStackTrace();
//        } finally {
//            lock.unlock();
//        }
//    }

}

new ReentrantLock();

Lock分为三部曲
1.new ReentrantLock();
2.lock.lock();
3.try-catch-finally=>lock.unlock();

/**
 * 注释
 *
 * @author sunhao
 * @Date 2021-08-23-21:11
 */
public class Test01 {

    public static void main(String[] args) {
        Book book = new Book();

        new Thread(() -> { for (int i = 0; i < 60; i++) book.sell(); }, "A").start();
        new Thread(() -> { for (int i = 0; i < 60; i++) book.sell(); }, "B").start();
        new Thread(() -> { for (int i = 0; i < 60; i++) book.sell(); }, "C").start();
    }
}


class Book{
    int num = 60;
//    public synchronized void sell(){
//        if (num > 0)
//        System.out.println(Thread.currentThread().getName()+"卖出了第" + (num--)+ "本剩余" + num + "本");
//    }

    Lock lock = new ReentrantLock();
    public void sell(){
        lock.lock();
        try {
            if (num > 0)
                System.out.println(Thread.currentThread().getName()+"卖出了第" + (num--)+ "本剩余" + num + "本");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }

}

点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消