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

     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. 在服务器 部署 asp.net core 报502.5的错

    HTTP Error 502.5 - Process Failure 如果 IIS 该安装的都装好了的话,那就需要安装一个.net core sdk,链接如下: https://www.microso ...

  2. [Network Architecture]ResNext论文笔记(转)

    文章地址: https://blog.csdn.net/u014380165/article/details/71667916 论文:Aggregated Residual Transformatio ...

  3. SpringMvc 笔记

    整理出来是 SpringMvc 笔记 方便以后查询 框架太多了 不经常使用 忘记的可能性很大 自己整理一套笔记 一看就明白了 1 对比 原始请求响应流程 1 发送请求 --> 2 控制层 --& ...

  4. 使用IP spoofer 功能

    有个问题请教:使用IP spoofer 功能后,很多vuser都会挂掉,这个怎么解决呢? LR

  5. 简单搭建FastDFS分布式文件系统(简单易懂)

    一.什么是FastDFS FastDFS一个开源的轻量级分布式文件系统,它对文件进行管理,充分考虑了冗余备份.负载均衡.线性扩容等机制,并注重高可用.高性能等指标,功能包括:文件存储.文件同步.文件访 ...

  6. thinkphp3.2.3 + nginx 配置二级域名

    使用的是阿里云centOS.74 第一步: 配置urlpath server { listen ; server_name www.xxxx.com xxxx.com; root /data/www/ ...

  7. HTML 参考手册- (HTML5 标准)

    HTML 参考手册- (HTML5 标准) 功能排序 New : HTML5 新标签 标签 描述 基础   <!DOCTYPE>  定义文档类型. <html> 定义一个 HT ...

  8. Python之NumPy中线性代数

    参考博客:http://blog.csdn.net/u013930163/article/details/51839983 网站:https://docs.scipy.org/doc/numpy-de ...

  9. day22 CMDB 基础部分 (一)

    参考博客: http://www.cnblogs.com/alex3714/articles/5420433.html

  10. 控制语句2:循环:for 与 while

    循环是所有编程语言的必备利器,用于重复的动作等等. python中的循环有何特殊性:for 与 while 都有自己的else分支. 要学会刹车: 1.条件的控制次数 2.break 与 contin ...