学习笔记1

Monitor

(1)synchronized的底层就是通过Monitor实现的,monitor是实现java线程互斥与协作的手段,可以将monitor视为对象或者Class的锁,每个对象都有唯一一个monitor.
(2)下图是线程与monitor之间的关系,以及线程的状态转换:在这里插入图片描述
什么时候线程在Entry Set:线程通过synchronized获取对象锁(monitor),但是对象锁被其他线程拥有,此时该线程进入entry set;否则线程拥有锁,执行临界区代码(被synchronized保护的代码为临界区代码)。一旦锁被释放,那么entry set中的线程都可以竞争锁。
什么时候为The Owner:即线程成功竞争到锁。执行临界区的代码。
**什么时候现场在wait set中:**在synchronized保护的代码块中,拥有monitor的对象调用了wait()方法,那么目前拥有锁的线程释放锁,变为WAIT状态,该线程被放入wait set中。
具体参考:链接: https://blog.csdn.net/mulinsen77/article/details/88635558.

关于不同版本中永久代的变化

以jdk1.7为边界:在这里插入图片描述
在JDK 6及之前的HotSpot VM里,静态字段依附在InstanceKlass对象的末尾;而在JDK 7开始的HotSpot VM里,静态字段依附在java.lang.Class对象的末尾。
在这里插入图片描述
在这里插入图片描述

jvm中符号引用如何存储以及如何转化为直接引用

https://www.zhihu.com/question/30300585/answer/51335493
https://www.zhihu.com/question/50258991

类中的成员变量和类变量

类在编译成class文件时,会自动生成了两个函数:对象构造函数()函数和类构造函数()。成员变量和类变量就相当于分别是他们的局部变量。如果类变量或普通成员变量在定义时被赋了初始值如public int a = 123,那么就会在()方法中生成对应的赋值指令,在对象初始化(实例化)的时候给变量赋值。

static修饰的方法和字段

方法都是存储在本类的方法表中,因此子类不会存储父类的方法,除非子类重写了父类的方法。
而对象会存储父类的实例变量(注意不会出去了static变量,因为static变量存在Class对象末尾)

jol(java object layout)类库可以打印出对象的布局

在这里插入图片描述

cas本身如何保证原子性

cas最底层实现:cpu支持的原语“lock cmpxchg(compare and exchange)”,这个lock是在多核cpu的环境下才存在的,lock将该缓存行锁住,防止其他核访问该内存。如果是单核则底层是cmpxchg实现CAS
CAS原理参考:
链接: https://blog.csdn.net/qq_32998153/article/details/79529704.

==AQS(AbstractQueuedSynchronizer) ==

链接: https://www.cnblogs.com/waterystone/p/4920797.html.

类型转化

(1)容量小的类型会默认转化为容量大的类型:
byte->short->int->long->float->double
char->int->long->float->double
eg: byte b = 12;
short a = b;
把byte转化为short不需要添加强制转换
(2)boolean不能转化为其他类型

hashMap与HashTable的key与value为null的问题

在这里插入图片描述
在这里插入图片描述
hashmap当key为null时,会把键值对放在index=0的位置。

java中的异常

在这里插入图片描述
在这里插入图片描述
如果throw语句抛出的异常是Checked异常,则该throw语句要么处于try块里,显式捕获该异常,要么放在一个带throws声明抛出的方法中,即把该异常交给该方法的调用者处理。
如果throw语句抛出的异常是Runtime异常,则该语句无须放在try块中,也无须放在带throws声明抛出的方法中,程序既可以显示使用try…catch来捕获并处理该异常,也可以完全不理会该异常,把该异常交给该方法调用者处理。

动态语言与静态语言

静态语言:在编译期就进行类型检查,即在编译阶段变量就被指定了具体的类型。如变量String str = new String(“aaa”),在编译阶段,str就具有了类型:在常量池中存储了对应变量的符号引用包含变量所属的类以及变量简单名称“str”以及变量的描述符号“Ljava/lang/String”
动态语言:在程序运行期间进行类型检查,即变量不用指定类型,变量值才有类型

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值