zoukankan      html  css  js  c++  java
  • Java代码中谁拿到了锁?

    我们都知道当一个线程试图访问同步代码块时,它首先必须得到锁,退出或抛出异常时必须释放锁。这些基础也许大家都知道,但是很多人还是搞不清哪个对象才是锁?如果你能正确回答以下问题,那么才算你彻底搞明白了哪个对象才是锁?

    静态同步方法问题

    如下代码是两个静态同步方法:

    Class A{
    
    public static synchronized void write(boolean b){
      isTrue = b;
    }
    
    public static synchronized boolean read(){
      return isTrue;
    }
    }
    

    那么我们来问几个问题:

    1. 线程1访问A.write(true)方法时,线程2能访问A.read()方法吗?
    2. 线程1访问new A().write(false)方法时,线程2能访问new A().read()方法吗?
    3. 线程1访问A.write(false)方法时,线程2能访问new A().read()方法吗?

    实例同步方法问题

    如下代码是两个实例同步方法:

    public synchronized void write(boolean b){
      isTrue = b;
    }
    
    public synchronized boolean read(){
      return isTrue;
    }
    

    同样问两个问题:

    1. A a=new A(); 线程1访问a.write(false)方法,线程2能访问a.read()方法吗?
    2. A a=new A(); A b=new A();线程1访问a.write(false)方法,线程2能访问b.read()方法吗?

    答案

    我们先回顾基础知识,Java中的每一个对象都可以作为锁,而不同的场景锁是不一样的。

    1. 对于实例同步方法,锁是当前实例对象。
    2. 对于静态同步方法,锁是当前对象的Class对象。
    3. 对于同步方法块,锁是Synchonized括号里配置的对象。

    线程1访问A.write()方法时,线程2能访问A.read()方法吗?不能,因为静态方法的锁都是A.Class对象,线程1拿到锁之后,线程2就拿不到锁了。

    线程1访问new A().write()方法时,线程2能访问new A().read()方法吗?不能,原因同上。

    线程1访问A.write()方法时,线程2能访问new A().read()方法吗?不能,原因同上

    A a=new A(); 线程1访问a.write()方法,线程2能访问a.read()方法吗?不能,因为这两个方法的锁都是对象a,线程1拿到了锁,线程2就不能访问了。

    A a=new A(); A b=new A();线程1访问a.write()方法,线程2能访问b.read()方法吗?可以,因为线程1拿到的是锁是 a,而线程2访问b.read()需要的是锁是b。

    转载自并发编程网 – ifeve.com本文链接地址: 哪个对象才是锁?

  • 相关阅读:
    安装包报错2503解决方法
    js中return;、return true、return false;区别
    图片添加border 不占用图片的大小
    效果网址http://sc.chinaz.com/tag_jiaoben/tupianlunbo.html
    兼容ie8 rgba()用法
    html使用css让文字多行超出部分用省略号三个点显示的方法案例
    MyCat02--MyCat入门无ZK实践
    MyCat01--基础
    MySQL/MariaDB导入(load data infile)导出(select into outfile)
    MariaDB/Mysql临时表
  • 原文地址:https://www.cnblogs.com/acode/p/6697890.html
Copyright © 2011-2022 走看看