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核心技术卷一》
目录
相关文章
|
6月前
|
Java
java判断Object对象是否为空demo
java判断Object对象是否为空demo
|
2天前
|
JavaScript
js 字符串String转对象Object
该代码示例展示了如何将一个以逗号分隔的字符串(`'1.2,2,3,4,5'`)转换为对象数组。通过使用`split(',')`分割字符串并`map(parseFloat)`处理每个元素,将字符串转换成浮点数数组,最终得到一个对象数组,其类型为`object`。
|
6月前
判断Object对象是否为空
判断Object对象是否为空
|
2天前
|
存储 设计模式 Python
Python中的类(Class)和对象(Object)
Python中的类(Class)和对象(Object)
33 0
|
2天前
|
存储 JavaScript
JS中Map对象与object的区别
JS中Map对象与object的区别
|
2天前
|
Java 流计算
在Flink实时任务中,POJO(Plain Old Java Object)对象的模式演进可能会引起不兼容的问题
【2月更文挑战第6天】在Flink实时任务中,POJO(Plain Old Java Object)对象的模式演进可能会引起不兼容的问题
25 3
|
2天前
|
JavaScript 前端开发 测试技术
Proxy vs Object.defineProperty:哪种对象拦截机制更适合你?
Proxy vs Object.defineProperty:哪种对象拦截机制更适合你?
|
2天前
|
存储 JavaScript 前端开发
【JavaScript】<面向对象Object>函数方法&对象创建&原型对象&作用域解析
【1月更文挑战第17天】【JavaScript】<面向对象Object>函数方法&对象创建&原型对象&作用域解析
|
2天前
|
JavaScript 前端开发
如何巧妙使用`Object.keys`方法将`JS`的一个对象的特定的值赋值给另外一个对象
如何巧妙使用`Object.keys`方法将`JS`的一个对象的特定的值赋值给另外一个对象
19 0
|
9月前
|
JavaScript 前端开发
JavaScript 使用对象字面量创建对象、使用new Object创建对象
JavaScript 使用对象字面量创建对象、使用new Object创建对象
77 0