视频课程
小黑屋思过中,禁止观看!
评论并刷新后可见

您需要在视频最下面评论并刷新后,方可查看完整视频

视频课程
立即观看
付费视频

您支付费用,方可查看完整视频

¥{{user.role.value}}
课程视频
开始学习
会员专享

视频合集

最全Java锁详解:悲观/乐观锁+公平/非公平锁等

  • 课程笔记
  • 问答交流

Java锁的种类繁多,而且面试频次也非常高,所以我单独把它汇总出来讲解。
为了助大家掌握好锁,这节课我重点会讲解以下5点:

1.常见锁的种类

2.悲观锁与乐观锁

3.JVM对锁进行了哪些优化

4.自旋锁

5.公平锁与非公平锁

Java锁的种类

最全Java锁详解:悲观/乐观锁+公平/非公平锁等-mikechen
1.乐观锁

顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制

乐观锁适用于多读的应用类型,乐观锁在Java中是通过使用无锁编程来实现,最常采用的是CAS算法,Java原子类中的递增操作就通过CAS自旋实现的

CAS全称 Compare And Swap(比较与交换),是一种无锁算法。

public final int getAndAddInt(Object var1, long var2, int var4) {
        int var5;
        do {
            var5 = this.getIntVolatile(var1, var2);
        } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));

        return var5;
    }

 

2.悲观锁

1)Synchronized

/**
 * 用在普通方法
 */
private synchronized void synchronizedMethod() {

    System.out.println("--synchronizedMethod start--");
    try {
        Thread.sleep(2000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println("--synchronizedMethod end--");
}

2)ReentrantLock 

private ReentrantLock lock = new ReentrantLock();

        // 卖票
        public void sell() {

            while (ticketNum > 0) {
                try {
                   
                    lock.lock();

                    if (ticketNum > 0) {
                        try {
                            TimeUnit.MILLISECONDS.sleep(100);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }

                        System.out.println(Thread.currentThread().getName() + " 正在出售第  " + (ticketNum--));
                    }
                } finally {
                    // 释放锁
                    lock.unlock();
                }
            }
        }

Synchronized的锁升级流程

评论交流
    说说你的看法