一直不明白一个问题,因为在书上关于生产者和消费者的例子里看到一段这样的代码,估计很多人都和我一样迷惑

     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 和同步方法锁,对象锁的联系,关系,区别;的更多相关文章

  1. java 为什么wait(),notify(),notifyAll()必须在同步方法/代码块中调用?

    在Java中,所有对象都能够被作为"监视器monitor"——指一个拥有一个独占锁,一个入口队列和一个等待队列的实体entity.所有对象的非同步方法都能够在任意时刻被任意线程调用 ...

  2. [转]java 为什么wait(),notify(),notifyAll()必须在同步方法/代码块中调用?

    在 Java中,所有对象都能够被作为"监视器monitor"——指一个拥有一个独占锁,一个入口队列和一个等待队列的实体entity. 所有对象的非同步 方法都能够在任意时刻被任意线 ...

  3. java中的wait(),notify(),notifyAll(),synchronized方法

    wait(),notify(),notifyAll()三个方法不是Thread的方法,而是Object的方法.意味着所有对象都有这三个方法,因为每个对象都有锁,所以自然也都有操作锁的方法了.这三个方法 ...

  4. java 线程 wait join sleep yield notify notifyall synchronized

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 休息方法 : 在指定时间内 让该线程 暂停, 不会释放 锁标志. 等待方法: 让 该 线 ...

  5. java synchronized类锁,对象锁详解(转载)

    觉得还不错 留个记录,转载自http://zhh9106.iteye.com/blog/2151791 在java编程中,经常需要用到同步,而用得最多的也许是synchronized关键字了,下面看看 ...

  6. (转)Synchronized(对象锁)和Static Synchronized(类锁)的区别

    场景:面试的时候经常用得到! 1 综述 Synchronized和Static Synchronized区别 一个是实例锁(锁在某一个实例对象上,如果该类是单例,那么该锁也具有全局锁的概念),一个是全 ...

  7. Java锁Synchronized对象锁和类锁区别

    java的内置锁:每个java对象都可以用做一个实现同步的锁,这些锁成为内置锁.线程进入同步代码块或方法的时候会自动获得该锁,在退出同步代码块或方法时会释放该锁.获得内置锁的唯一途径就是进入这个锁的保 ...

  8. Java对象锁和类锁全面解析(多线程synchronized关键字)

    最近工作有用到一些多线程的东西,之前吧,有用到synchronized同步块,不过是别人怎么用就跟着用,并没有搞清楚锁的概念.最近也是遇到一些问题,不搞清楚锁的概念,很容易碰壁,甚至有些时候自己连用没 ...

  9. Synchronized方法锁、对象锁、类锁区别

    synchronized,这个东西我们一般称之为”同步锁“,他在修饰代码块的时候需要传入一个引用对象作为“锁”的对象. 在修饰方法的时候,默认是当前对象作为锁的对象 在修饰类时,默认是当前类的Clas ...

随机推荐

  1. 客户端发一个post请求

    public static String doPostStr(String httpUrl, String str) { HttpPost httpPost = null; try { HttpCli ...

  2. Numpy学习1

    NumPy学习(1) 参考资料: http://www.cnblogs.com/zhanghaohong/p/4854858.html http://linusp.github.io/2016/02/ ...

  3. Java数字证书操作

    为服务器生成证书 keytool -genkey -v -alias tomcat -keyalg RSA -keystore D:\tomcat.keystore -validity 36500 为 ...

  4. 使用FireFox插件RESTClient工具POST方法?

    下面尝试用Firefox的restclient,来调取api 当然需要打开火狐浏览器安装restclient的插件https://addons.mozilla.org/en-US/firefox/ad ...

  5. .aspx页面 引用命名空间 (Import 指令,web.config)

    单个页面 要引用其他命名空间,在页面中写: < %@ import namespace="system.text" %> 注:即可,需要引用多个命名空间,不能写多个na ...

  6. [转载]查看JDK及Java框架的源代码

    1.点 "window"-> "Preferences" -> "Java" -> "Installed JRE ...

  7. 关于java.lang.Exception:No tests found matching的一系列解决方法

    问题描述: java.lang.Exception: No tests found matching [{ExactMatcher:fDisplayName=yahaa], {ExactMatcher ...

  8. 《Think in Java》(十三)字符串

    学完这章后,对 Java 字符串有了重新的认识.自己也看了下 CharSequence,String,StringBuilder,StringBuffer 等类的实现代码.

  9. HDU 4825 Trie树 异或树!

    Xor Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others)Total S ...

  10. Ubuntu 下Python 环境问题

    问题描述: 原先使用Anaconda环境,若卸载后仍不能恢复到系统默认的Python环境. 解决方案: shell 寻找缓存路径,python的扩展/home/tom/anaconda/bin/pyt ...