哪个对象才是锁?
来源:互联网 发布:淘宝店铺名怎么改呢 编辑:程序博客网 时间:2024/04/29 10:21
转载自:http://ifeve.com/who-is-lock/
我们都知道当一个线程试图访问同步代码块时,它首先必须得到锁,退出或抛出异常时必须释放锁。这些基础也许大家都知道,但是很多人还是搞不清哪个对象才是锁?如果你能正确回答以下问题,那么才算你彻底搞明白了哪个对象才是锁?
静态同步方法问题
如下代码是两个静态同步方法
Class A{ public static synchronized void write(boolean b){ isTrue = b; } public static synchronized boolean read(){ return isTrue; }}
那么我们来问几个问题
- 线程1访问A.write(true)方法时,线程2能访问A.read()方法吗?
- 线程1访问new A().write(false)方法时,线程2能访问new A().read()方法吗?
- 线程1访问A.write(false)方法时,线程2能访问new A().read()方法吗?
实例同步方法问题
如下代码是两个实例同步方法
public synchronized void write(boolean b){ isTrue = b;}public synchronized boolean read(){ return isTrue;}
同样问两个问题:
- A a=new A(); 线程1访问a.write(false)方法,线程2能访问a.read()方法吗?
- A a=new A(); A b=new A();线程1访问a.write(false)方法,线程2能访问b.read()方法吗?
回答问题之前,先想一下当前方法使用的锁是哪一个?当前线程是否有拿到这把锁?拿到锁了就能访问当前方法了。
答案
我们先回顾基础知识,Java中的每一个对象都可以作为锁,而不同的场景锁是不一样的。
- 对于实例同步方法,锁是当前实例对象。
- 对于静态同步方法,锁是当前对象的Class对象。
- 对于实例同步方法块,锁是Synchonized括号里配置的对象。
- 对于静态同步方法块,锁是Synchronized括号配置的类的Class对象。(一般是当前类的Class对象)
线程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。
现在你应该明白了这句话,对于实例同步方法,锁是当前实例对象。对于静态同步方法,锁是当前对象的Class对象。
- 哪个对象才是锁?
- 哪个对象才是锁?
- 哪个对象才是锁?
- 哪个对象才是锁?
- 哪个对象才是锁?
- Java并发系列-20、哪个对象才是锁
- Java多线程之对象锁,问:到底是哪个对象?
- 熊二、程序猿、大个ル、 哪个才是我
- Arduino VS 树莓派:哪个才是你的菜?
- ubuntu14.04 怎么查看哪个串口才是有效的搜索?
- Mac虚拟机与双系统哪个才是你的菜
- Java锁 到底锁的是哪个对象?
- Java锁 到底锁的是哪个对象?
- Java锁 到底锁的是哪个对象?
- RSA的公钥和私钥到底哪个才是用来加密和哪个用来解密
- RSA的公钥和私钥到底哪个才是用来加密和哪个用来解密?
- 思维才是王道面向对象分析问题
- 内存才是对象活动的主要空间
- ubuntu 14.04 双显卡安装NVIDIA GPU驱动+CUDA+编译配置caffe
- android中的对话框
- Hibernate基础--->HQL查询的分页功能
- 耗时整整一天,整理出的超详细清晰的vim,vimrc配置
- <Android开源库> Realm For Android~ RelationShips and Writes(译文)
- 哪个对象才是锁?
- iterator迭代
- 创建的新数据库,为什么在数据库界面中不显示出来,一直隐藏着
- JAVA蓝桥杯:字母图形
- 剑指Offer面试题12打印1到最大的n位数,面试题13在O(1)时间删除链表结点
- oracle 创建包和存储过程并调用举例
- linux常用命令及小结
- logstash参数配置
- socket编程中的I/O模型