问答

不同方法中的synchronized的锁之间会有影响吗?

作者:admin 2021-06-22 我要评论

public void A(){ synchronized(Object.class){ //业务 }}public void B(){ synchronized(Object.class){ //业务 }} 想问一下,AB两个方法,用的是都是Object.cl...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)
public void A(){
     synchronized(Object.class){
        //业务  
     }
}
public void B(){
     synchronized(Object.class){
        //业务
     }
}

想问一下,AB两个方法,用的是都是Object.class作为锁,如果两个线程分别访问AB两个方法,A方法中的锁被占用,B方法synchronized中的业务会执行吗,两个Object是同一把锁吗

###

Object类对象只有一个,一个方法锁住了,另一个就要阻塞。
A方法锁住了,B方法肯定阻塞,等到A方法释放锁,B方法获取锁以后才能执行。
下面的代码是顺序执行的。

    public static void main(String[] args) {
        new Thread(No26_removeDuplicates::A).start();
        new Thread(No26_removeDuplicates::B).start();
    }

    public static void A() {
        synchronized (Object.class) {
            System.out.println("A start");
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("A end");
        }
    }

    public static void B() {
        synchronized (Object.class) {
            System.out.println("B start");
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("B end");
        }
    }
###

不会。锁定的是Object.class对象

###

Object.class 只有一个对象,所以第二个线程进不去,不过还是建立自己建立一个静态对象,这样就只会有一个

一个类中,synchronized 修饰实例方法 锁是 this

一个类中, synchronized 修饰静态方法 锁是 类名 .class

###

A方法占用锁,B方法肯定会阻塞住。因为这两个方法用的是同一把锁 Object.class

###

两个方法拿到的都是Object.class 锁, Object.class对象只存在一个,所以是同一把锁

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • 不同方法中的synchronized的锁之间会有

    不同方法中的synchronized的锁之间会有

  • centos在下载的时候,为什么有这么多版

    centos在下载的时候,为什么有这么多版

  • 改变了查询条件,视图没跟着更新

    改变了查询条件,视图没跟着更新

  • 怎么给highcharts series data进行赋值

    怎么给highcharts series data进行赋值

腾讯云代理商
海外云服务器