[关闭]
@Awille 2021-10-16T09:13:38.000000Z 字数 8535 阅读 196

Java基础

Java 基础


1、动态代理

java动态代理好文章

1.1、设计模式-代理模式

代理类与委托类有相同的接口
image.png-241.3kB

1.2、静态代理

在编译是就已经将接口、代理类、被代理类确定下来。在程序运行之前,代理类的.class文件就已经生成。

1.3、动态代理

代理类根据我们在Java代码中的指示动态生成。动态代理的优势 在于很方便的对代理类的函数进行统一的处理,而不用修改每个代理类中的方法。 使用反射的原理,使用Proxy类传入classloader与代理类接口,创建的代理类会使用IvocationHandler的invoke接口调用各个代理对象的接口。

2、Java值传递

Java中只有值传递,没有引用传递。

3、Java Collection 集合

3.1、Collection的整体结构

3.2、Iterator、ListIterator

  1. An iterator for lists that allows the programmer to traverse the list in either direction, modify the list during iteration, and obtain the iterator's current position in the list. A ListIterator has no current element; its cursor position always lies between the element that would be returned by a call to previous() and the element that would be returned by a call to next(). An iterator for a list of length n has n+1 possible cursor positions, as illustrated by the carets (^) below:
  2. Element(0) Element(1) Element(2) ... Element(n-1)
  3. cursor positions: ^ ^ ^ ^ ^
  4. Note that the remove and set(Object) methods are not defined in terms of the cursor position; they are defined to operate on the last element returned by a call to next or previous().

3.3、List集合

4、Java运行时数据区域

4.1、程序计数器

4.2、Java虚拟机栈

4.3、本地方法栈

4.4、Java堆

4.5、方法区

4.6、运行时常量池(方法区的一部分)

5、虚拟机对象探秘

5.1 对象的创建

5.2、对象的内存布局:

5.3、对象的访问定位

string.intern()是一个native方法,如果字符串常量池中已经包含一个等于该string对象的字符串,则返回常量池中这个字符串的string对象,否则将该string对象包含的字符串加到常量池中。

6、垃圾收集器与内存分配策略

6.1 对象已死吗?

6.2、引用

一个对象的死亡至少要经历两次标记的过程,如果在对象进行可达性分析知识,对象没有与任何一个gc root的引用链,它会进行第一次筛选,如果重写了finalize方法并且没有被执行过,该对象会被放置到一个f-queue当中,并且用虚拟机创建的低优先级finalizer线程去执行。在finialz方法中对象可以机进行一次自我拯救。

6.3、回收方法区

方法区垃圾手机的两部分内容为:废弃常量与无用类。
无用类的判定党发:
* 该类的所有实例已被回收
* 该类的classloader已被回收
* 该类对应的java.lang.class对象没有在任何地方被医用,无法在任何地方通过反射方位该类。

6.4、垃圾收集算法

6.5、HotSpot的垃圾收集算法实现

7、类文件结构

todo 目前为止不太用得到,而且看完以后很容易忘,感觉需要哪天涉及到字节码插桩等项目时具体去深入。毕竟实践才是最佳的学习。

8、类加载机制

8.1、类加载时机

8.2、类加载的过程

8.3、类加载器

9、Java内存模型与线程

由于计算机的存储设备与处理器的运算速度由几个量级的差距,所以现代计算机系统都不得不加入一层读写速度尽可能接近处理器的高速缓存来作为内存与处理器之间的缓冲。 由于缓存的存在,很好的解决了处理器与内存的速度矛盾,但也增加了系统复杂性,带来了缓存一致性问题。每个处理器都有自己的告诉缓存,而他们又共享同一主内存。为了解决一致性问题,缓存在对主内存进行读写时,要遵循一个协议。
image.png-58kB

为了使得处理器内部的运算单元能被充分利用,处理器可能会对输入代码乱序执行优化。

9.1、内存间的交互操作:

果要把一个变量从主内存复制到工作内存,那就要顺序地执行read和load操作,如果要把变量从工作内存同步回主内存,就要顺序地执行store和write操作。

执行以上操作必须满足一下规则:
a、read和load, store和write不允许单独出现
b、不允许一个线程丢弃它最近的assignn操作,即变量在工作内存中改变后必须要把该变化同步会主内存。
c、果要把一个变量从主内存复制到工作内存,那就要顺序地执行read和load操作,如果要把变量从工作内存同步回主内存,就要顺序地执行store和write操作
d、一个新的变量只能在主内存中“诞生”,不允许在工作内存中直接使用一个未被初始化(load或assign)的变量,换句话说,就是对一个变量实施use、store操作之前,必须先执行过了assign和load操作。
e、一个变量在同一个时刻只允许一条线程对其进行lock操作,但lock操作可以被同一条线程重复执行多次,多次执行lock后,只有执行相同次数的unlock操作,变量才会被解锁。
f、如果对一个变量执行lock操作,那将会清空工作内存中此变量的值,在执行引擎使用这个变量前,需要重新执行load或assign操作初始化变量的值。
g、如果一个变量事先没有被lock操作锁定,那就不允许对它执行unlock操作,也不允许去unlock一个被其他线程锁定住的变量
h、对一个变量执行unlock操作之前,必须先把此变量同步回主内存中(执行store、write操作)。

9.2、对于volatile变量的特殊规则

9.3、Java与线程状态

10、线程安全与锁优化

10.1、线程安全的实现方法

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注