wait() ,notify() ,notifyAll(),synchronized 和同步方法锁,对象锁的联系,关系,区别;
一直不明白一个问题,因为在书上关于生产者和消费者的例子里看到一段这样的代码,估计很多人都和我一样迷惑
public synchronized void set(String name, String content) {
if (!flag) {
try {
super.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
this.setNme(name);
.......
}
}
第一个迷惑 同步方法的实质是什么 ?
任何一个调用该方法的对象object,object.set(...); 则该代码等效于以下代码; 就是这个对象锁;静态方法,可以类推(将类本身看成一个对象)
推荐一篇好文章 链接地址
public void set( String name,String content ) {
synchronized (this) {
if (!flag) {
try {
super.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
this.setNme(name);
.......
}
}
}
第二点疑惑, super.wait() 是什么意思?
super.wait() 等价于 this.wait() 因为 Object 类实现了 wait() ,notify(),notifyAll() 方法,任何一个类都继承了 Objecct()类,所以,,,不解释
第三点疑惑, object1.wait() 尽量放在 synchronized( object1 ) 锁里面,而不要放在 synchronized( object2 )锁里面?
设想 N 个线程访问 synchronized( object2 ) 其中有一个占到了锁,他在里面进行 object1.wait() 的时候,我要释放object1 这个锁,问题是object1这个对象的锁你压根就没有,你却释放这个锁,不知道你到底想干嘛。就好比我拿了第二个房间的钥匙,进了第二个房间,同时告诉别人第一个房间我不要用了,问题是第一个房间和你毛关系都没有啊?所以代码尽量写成 synchronized( object2 ){ object2.wait(); };
第4点疑惑 为什么wait 和 notify 需要写在锁里面;
依据第三点,当该线程压根就不知道自己是否拿到这个锁的钥匙的时候,应该是说没有拿到这个钥匙的时候,就说我不要用了,我要把钥匙还回去?让我感觉不能理解
第5点疑惑 notifyAll 的本质是;
唤醒所有在等待的线程,但谁先拿到锁,谁先执行,没有拿到锁的继续等待锁释放后能执行。因此虽然只有一个线程能执行,其他都在等待,但是要理解,其他在等待的是等待锁释放,而不是被唤醒,因为,notifyAll 已经唤醒了;
第6个疑惑 一把钥匙开两次锁
B方法可以执行吧……就是说B方法获得锁之后,调用的A方法也可以获得该锁?
public synchronized void methodA(int a, int b){
}
public synchronized void methodB(int a){
methodA(a, 0);
}
知乎上有解答 链接地址
wait() ,notify() ,notifyAll(),synchronized 和同步方法锁,对象锁的联系,关系,区别;的更多相关文章
- java 为什么wait(),notify(),notifyAll()必须在同步方法/代码块中调用?
在Java中,所有对象都能够被作为"监视器monitor"——指一个拥有一个独占锁,一个入口队列和一个等待队列的实体entity.所有对象的非同步方法都能够在任意时刻被任意线程调用 ...
- [转]java 为什么wait(),notify(),notifyAll()必须在同步方法/代码块中调用?
在 Java中,所有对象都能够被作为"监视器monitor"——指一个拥有一个独占锁,一个入口队列和一个等待队列的实体entity. 所有对象的非同步 方法都能够在任意时刻被任意线 ...
- java中的wait(),notify(),notifyAll(),synchronized方法
wait(),notify(),notifyAll()三个方法不是Thread的方法,而是Object的方法.意味着所有对象都有这三个方法,因为每个对象都有锁,所以自然也都有操作锁的方法了.这三个方法 ...
- java 线程 wait join sleep yield notify notifyall synchronized
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha 休息方法 : 在指定时间内 让该线程 暂停, 不会释放 锁标志. 等待方法: 让 该 线 ...
- java synchronized类锁,对象锁详解(转载)
觉得还不错 留个记录,转载自http://zhh9106.iteye.com/blog/2151791 在java编程中,经常需要用到同步,而用得最多的也许是synchronized关键字了,下面看看 ...
- (转)Synchronized(对象锁)和Static Synchronized(类锁)的区别
场景:面试的时候经常用得到! 1 综述 Synchronized和Static Synchronized区别 一个是实例锁(锁在某一个实例对象上,如果该类是单例,那么该锁也具有全局锁的概念),一个是全 ...
- Java锁Synchronized对象锁和类锁区别
java的内置锁:每个java对象都可以用做一个实现同步的锁,这些锁成为内置锁.线程进入同步代码块或方法的时候会自动获得该锁,在退出同步代码块或方法时会释放该锁.获得内置锁的唯一途径就是进入这个锁的保 ...
- Java对象锁和类锁全面解析(多线程synchronized关键字)
最近工作有用到一些多线程的东西,之前吧,有用到synchronized同步块,不过是别人怎么用就跟着用,并没有搞清楚锁的概念.最近也是遇到一些问题,不搞清楚锁的概念,很容易碰壁,甚至有些时候自己连用没 ...
- Synchronized方法锁、对象锁、类锁区别
synchronized,这个东西我们一般称之为”同步锁“,他在修饰代码块的时候需要传入一个引用对象作为“锁”的对象. 在修饰方法的时候,默认是当前对象作为锁的对象 在修饰类时,默认是当前类的Clas ...
随机推荐
- Python学习札记(七) Basic4 条件判断
参考:条件判断 Note 1.Python的条件判断关键字与C语言类似,if.else,以及elif,相当于C语言中的else if. 2.Python与C语言不一样的是,使用缩进来判断语句是否属于条 ...
- geoserver源码学习与扩展——跨域访问配置
在 geoserver源码学习与扩展——restAPI访问 博客中提到了geoserver的跨域参数设置,本文详细讲一下geoserver的跨域访问配置. geoserver的跨域访问依赖java-p ...
- SQL优化- in和not in
in不会导致索引失效,但最终数据库会将in语句解析为or语句,eg: select * from T_MAIN_PROCESS t where t.audit_status_code in ('05' ...
- java classloader原理深究
前面已经写过一篇关于java classloader的拙文java classloader原理初探. 时隔几年,再看一遍,觉得有些地方显得太过苍白,于是再来一篇: 完成一个Java类之后,经过java ...
- Impala 技术点梳理
1.优点 1.1 快! 主节点生成执行计划树并分发执行计划至各节点并行执行的拉式获取数据(MR:推式获取数据) 计算的中间结果不写入磁盘 1.2 便利 提供SQL语义,可以方便的进行复杂的数据分析任 ...
- MyEclipse2014.Maven自动更新
1.我把 "Do not automatically update dependencies from remote repositories" 和 "Download ...
- zDialog弹出层插件
效果图如下: 提取自ZCMS的弹出框: 代替window.open.window.alert.window.confirm:提供良好的用户体验: 水晶质感,设计细腻,外观漂亮: 兼容ie6/7/8.f ...
- Poi中getPhysicalNumberOfCells 与 getLastCellNum的差异
getPhysicalNumberOfCells 与 getLastCellNum的区别 用org.apache.poi的包做excel导入,无意间发明若是excel文件中有空列,空列后面的数据全部读 ...
- MooseFS技术详解
原文 http://www.tuicool.com/articles/vQvEZ3y MooseFS是一款具有冗余容错功能的分布式文件系统.它把数据分散在多台服务器上,确保一份数据多个备份副本,对外提 ...
- linux正则表达式回忆记录
好久没用linux grep相关正则表达式,现在简单记录下. grep简介 grep 是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来.通常grep有三种版本grep.egr ...