Object对象你真理解了吗?(三)

简介: 笔记

notify方法:

76.jpg

notifyAll()方法:

77.jpg

看完上面的注释我们可以总结以下的要点

  • 无论是wait、notify还是notifyAll()都需要由监听器对象(锁对象)来进行调用
  • 简单来说:他们都是在同步代码块中调用的,否则会抛出异常!
  • notify()唤醒的是在等待队列的某个线程(不确定会唤醒哪个),notifyAll()唤醒的是等待队列所有线程
  • 导致wait()的线程被唤醒可以有4种情况
  • 该线程被中断
  • wait()时间到了
  • notify()唤醒
  • notifyAll()唤醒
  • 调用wait()的线程会释放掉锁

其实总结完上面的并不会有比较深刻的印象,可以尝试着回答几个问题来加深对wait()notify()的理解。


5.1为什么wait和notify在Object方法上?


从一开始我们就说了:wait()notify()是Java给我们提供线程之间通信的API,既然是线程的东西,那什么是在Object类上定义,而不是在Thread类上定义呢?

因为我们的锁是对象锁【要是忘记的同学可回顾:Java锁机制了解一下】,每个对象都可以成为锁。让当前线程等待某个对象的锁,当然应该通过这个对象来操作了

  • 锁对象是任意的,所以这些方法必须定义在Object类中


5.2notify方法调用后,会发生什么?


上面已经说了,notify会唤醒某个处于等待队列的线程。

但是要注意的是:

  • notify方法调用后,被唤醒的线程不会立马获得到锁对象。而是等待notify的synchronized代码块执行完之后才会获得锁对象


5.3sleep和wait有什么区别?


Thread.sleep()Object.wait()二者都可以暂停当前线程,释放CPU控制权。

  • 主要的区别在于Object.wait()在释放CPU同时,释放了对象锁的控制
  • Thread.sleep()没有对锁释放

参考资料:


六、finalize()方法


finalize()方法将在垃圾回收器清除对象之前调用,但该方法不知道何时调用,具有不定性

  • 一般我们都不会重写它~

一个对象的finalize()方法只会被调用一次,而且finalize()被调用不意味着gc会立即回收该对象,所以有可能调用finalize()后,该对象又不需要被回收了,然后到了真正要被回收的时候,因为前面调用过一次,所以不会调用finalize(),产生问题。

参考资料:

进阶的资料:


七、总结


总的来说也算是把Object看了一遍了,不至于一下子把它的方法给忘了~~~在学习的过程中也遇到过问题,最明显的是对protected修饰符又加深了一次理解。

78.jpg

参考资料:

  • 《Java核心技术卷一》
目录
相关文章
|
3月前
ES6中map对象的使用,确实比Object好使哈
ES6中Map对象的使用优势,包括任意类型作为键、直接获取大小、增删查改操作等。Map的键可以是函数、对象、NaN等,支持forEach循环和for...of循环。
38 1
ES6中map对象的使用,确实比Object好使哈
|
2月前
|
Python
通过 type 和 object 之间的关联,进一步分析类型对象
通过 type 和 object 之间的关联,进一步分析类型对象
68 3
|
2月前
|
JavaScript 前端开发 大数据
在JavaScript中,Object.assign()方法或展开语法(...)来合并对象,Object.freeze()方法来冻结对象,防止对象被修改
在JavaScript中,Object.assign()方法或展开语法(...)来合并对象,Object.freeze()方法来冻结对象,防止对象被修改
40 0
|
4月前
|
数据安全/隐私保护
作用域通信对象:session用户在登录时通过`void setAttribute(String name,Object value)`方法设置用户名和密码。点击登录按钮后,跳转到另外一个页面显示用户
该博客文章通过示例演示了如何使用session对象的`setAttribute`和`getAttribute`方法在不同页面间传递和显示用户的用户名和密码信息,并说明了如何设置会话的有效期。
作用域通信对象:session用户在登录时通过`void setAttribute(String name,Object value)`方法设置用户名和密码。点击登录按钮后,跳转到另外一个页面显示用户
|
4月前
|
SQL 存储 数据库
对象关系映射(Object-Relational Mapping)
【8月更文挑战第17天】
101 2
|
4月前
【Azure Developer】使用PowerShell Where-Object方法过滤多维ArrayList时候,遇见的诡异问题 -- 当查找结果只有一个对象时,返回结果修改了对象结构,把多维变为一维
【Azure Developer】使用PowerShell Where-Object方法过滤多维ArrayList时候,遇见的诡异问题 -- 当查找结果只有一个对象时,返回结果修改了对象结构,把多维变为一维
网易:所有的对象最终都会继承自 Object.prototype ? ——原型链(二)详细讲解!
网易:所有的对象最终都会继承自 Object.prototype ? ——原型链(二)详细讲解!
|
4月前
|
JavaScript
网易:所有的对象最终都会继承自 Object.prototype ? ——原型链(一)详细讲解!
网易:所有的对象最终都会继承自 Object.prototype ? ——原型链(一)详细讲解!
|
7月前
|
存储 算法 Java
滚雪球学Java(42):探索对象的奥秘:解析Java中的Object类
【5月更文挑战第17天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
61 2
|
6月前
|
Java 编译器 数据处理
JavaSE——面相对象高级一(4/4)-继承相关的注意事项:权限修饰符、单继承、Object类、方法重写、子类访问成员的特点......
JavaSE——面相对象高级一(4/4)-继承相关的注意事项:权限修饰符、单继承、Object类、方法重写、子类访问成员的特点......
63 0