前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JUC学习之8锁现象

JUC学习之8锁现象

作者头像
Java那些事儿
发布2020-07-21 15:35:34
6320
发布2020-07-21 15:35:34
举报
文章被收录于专栏:Java那些事儿

8锁现象,其实就是关于锁的八个问题,本节我们通过八个问题,逐渐带大家加深对锁的认识,为了方便演示,这里全部用synchronized演示。

synchronized 示例代码:

代码语言:javascript
复制
People1 people = new People1();
People1 people2 = new People1();

new Thread(people::eat,"A").start();
TimeUnit.SECONDS.sleep(2);
new Thread(people2::play,"B").start();
new Thread(people2::study,"C").start();
代码语言:javascript
复制
public class People1 {

    public synchronized void eat() {
        try {
            TimeUnit.SECONDS.sleep(4);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("synchronized method -> 吃饭");
    }

    public synchronized void play() {
        System.out.println("synchronized method -> 玩耍");
    }

    public void study() {
        System.out.println("synchronized method -> 学习");
    }
}

问题1:同一对象调用两个同步方法,先执行哪个?

synchronized method -> 吃饭

synchronized method -> 玩耍

问题2:eat延迟4秒呢?

synchronized method -> 吃饭

synchronized method -> 玩耍

问题3:同一对象调用1个同步方法,1个普通方法,先执行哪个?不同对象呢?

General method -> 学习

synchronized method -> 吃饭

General method -> 学习

synchronized method -> 吃饭

问题4:不同对象调用两个同步方法,先执行哪个?

synchronized method -> 玩耍

synchronized method -> 吃饭

总结:synchronized锁的是方法的调用者,这里就是people1,不同的对象对应不同的锁

static synchronized 示例代码:

代码语言:javascript
复制
People2 people = new People2();
People2 people2 = new People2();

new Thread(() -> people.eat(),"A").start();
TimeUnit.SECONDS.sleep(2);
new Thread(() -> people2.play(),"B").start();
new Thread(() -> people2.study(),"C").start();
代码语言:javascript
复制
public class People2 {

    public static synchronized void eat() {
        try {
            TimeUnit.SECONDS.sleep(4);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("static synchronized method-> 吃饭");
    }

    public static synchronized void play() {
        System.out.println("static synchronized method-> 玩耍");
    }

    public synchronized void study() {
        System.out.println("synchronized method-> 学习");
    }
}

问题5:同一对象调用两个静态同步方法,先执行哪个?

static synchronized method-> 吃饭

static synchronized method-> 玩耍

问题6:不同对象调用两个静态同步方法,先执行哪个?

static synchronized method-> 吃饭

static synchronized method-> 玩耍

问题7:同一对象调用1个静态同步方法,1个同步方法,先执行哪个?

synchronized method-> 学习

static synchronized method-> 吃饭

问题8:不同对象调用1个静态同步方法,1个同步方法,先执行哪个?

synchronized method-> 学习

static synchronized method-> 吃饭

总结:static 修饰的方法属于Class模版,只有一个

相信大家现在应该都明白了吧!

Q.E.D.

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-07-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • synchronized 示例代码:
    • 问题1:同一对象调用两个同步方法,先执行哪个?
      • 问题2:eat延迟4秒呢?
        • 问题3:同一对象调用1个同步方法,1个普通方法,先执行哪个?不同对象呢?
          • 问题4:不同对象调用两个同步方法,先执行哪个?
          • static synchronized 示例代码:
            • 问题5:同一对象调用两个静态同步方法,先执行哪个?
              • 问题6:不同对象调用两个静态同步方法,先执行哪个?
                • 问题7:同一对象调用1个静态同步方法,1个同步方法,先执行哪个?
                  • 问题8:不同对象调用1个静态同步方法,1个同步方法,先执行哪个?
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档