• wait() ,notify() ,notifyAll(),synchronized 和同步方法锁,对象锁的联系,关系,区别;


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

     1     public synchronized void set(String name, String content) {
     2         if (!flag) {
     3             try {
     4                 super.wait();
     5             } catch (InterruptedException e) {
     6                 e.printStackTrace();
     7             }
     8             this.setNme(name);
     9             .......
    10         }
    11     }

    View Code

             第一个迷惑  同步方法的实质是什么 ?  

                 任何一个调用该方法的对象object,object.set(...); 则该代码等效于以下代码; 就是这个对象锁;静态方法,可以类推(将类本身看成一个对象)

                 推荐一篇好文章   链接地址

     1     public  void set( String name,String content ) {
     2         synchronized (this) {
     3             if (!flag) {
     4                 try {
     5                     super.wait();
     6                 } catch (InterruptedException e) {
     7                     e.printStackTrace();
     8                 }
     9                 this.setNme(name);
    10                 .......
    11             }
    12         }
    13     }

    View Code

            第二点疑惑, 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);
              }

             知乎上有解答   链接地址

     

  • 相关阅读:
    Spring事务的那些坑,这里都给你总结好了!
    8 种方案解决重复提交问题!你选择哪一种呀?
    一张900w的数据表,16s执行的SQL优化到300ms?
    这 5 个开源的能挣钱的 SpringBoot 项目,真TMD香!
    邮箱mail 发送类 ASP.NET C#
    ValidationSugar表单验证框架-支持ASP.NET MVC ASP.NET WebFroM
    Jquery几个比较实用,但又让很多人忽略的几个函数
    ASP.NET MVC和WebForm 轻松实现前端和后端的双重验证 jquery.validate+ValidationSugar
    让 ASP.NET JS验证和服务端的 双验证 更简单
    ASP.NETC#通用扩展函数之TypeParse 类型转换方便多了
  • 原文地址:https://www.cnblogs.com/wulangzhou/p/4210988.html
Copyright © 2020-2023  润新知