继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

synchronized和Lock

不脱发的小Java
关注TA
已关注
手记 7
粉丝 0
获赞 7
  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();
        }
    }

}

打开App,阅读手记
1人推荐
发表评论
随时随地看视频慕课网APP