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

     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. 微服务(一)eureka

    Eureka概述 一个简单的服务注册,服务发现架构 在CAP理论中,eureka选择了ap,作为注册中心,数据可用比数据不一致更重要 逻辑架构图 Eureka特性 1.当注册中心挂了,客户端之间依然可 ...

  2. Entity Framework 基于Oracle的code first 问题汇总

    1. 在code first 在数据库中建表时,需要指定schema, 默认是dbo, 需要改成我们的oracle登录名 protected override void OnModelCreating ...

  3. spring boot 之Rabbitmq 基本配置

    /* * Copyright (c) 2017 4PX Information Technology Co.,Ltd. All rights reserved. */package com.fpx.p ...

  4. Openssl VS编译方法

    工具: 1. 编译环境win10+vs2015专业版 2. ActivePerl工具,官网下载链接:http://www.activestate.com/activeperl/downloads 3. ...

  5. Android -- 网络图片查看器,网络html查看器, 消息机制, 消息队列,线程间通讯

    1. 原理图 2. 示例代码 (网络图片查看器) (1)  HttpURLConnection (2) SmartImageView (开源框架:https://github.com/loopj/an ...

  6. Interleaving String,交叉字符串,动态规划

    问题描述: Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2. For example,Give ...

  7. Helper Files

    常用帮助类 C#语法糖 Net 通用工具类 Helloweba Front Program Resources jqGrid   Highcharts  jQuery实现的加载页面过渡效果   jQu ...

  8. Neutron三层网络服务实现原理

    Neutron 对虚拟三层网络的实现是通过其 L3 Agent (neutron-l3-agent).该 Agent 利用 Linux IP 栈.route 和 iptables 来实现内网内不同网络 ...

  9. leetcode 720. Longest Word in Dictionary

    Given a list of strings words representing an English Dictionary, find the longest word in words tha ...

  10. tcping的安装和使用

    1.LINUX安装方法: 编译安装下载地址: http://linuxco.de/tcping/tcping.html tar zxvf tcping-1.3.5.tar.gz cd tcping-1 ...