![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java基础学习笔记
文章平均质量分 68
Java基础学习笔记
北岛极客
It all depends
展开
-
解读java动态代理
一、什么叫代理?广义上,代理指受委托代表当事人进行某种活动,和现实生活中的中介含义几乎一致。 Java中,代理指创建一个对象的代理对象,代表该对象执行相关方法。Java代理分为静态代理和动态代理。二、代理场景一个男孩和一个女孩相亲,由于男孩自己不太想去,现在需要找一个替代者,如何用java实现呢?三、实现模式1——静态代理代理模式是常用设计模式的一种,我们在软件设计时常用...原创 2018-05-17 17:44:18 · 248 阅读 · 0 评论 -
Java8新特性(转自http://www.runoob.com/java/java8-new-features.html)
概述Java8 新增了非常多的特性,我们主要讨论以下几个:Lambda 表达式 − Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中)。方法引用 − 方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器。与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码。默认方法 − 默认方法就是一个在接口里面有了一个实现...转载 2018-12-14 11:36:03 · 540 阅读 · 0 评论 -
线程间通信
等待/通知机制方法wait()的作用是使当前执行代码的线程进行等待。在调用wait()之前,线程必须获得该对象的对象级别锁,即只能在同步方法或同步块中调用wait()方法。在执行wait()方法后,当前线程释放锁。方法notify()也要在同步方法或同步块中调用,即在调用前,线程也必须获得该对象的对象级别锁。该方法用来通知那些可能等待该对象的对象锁的其他线程,如果有多个线程等待,则由线程规...原创 2018-08-23 11:22:07 · 95 阅读 · 0 评论 -
synchronized深度解析
n个对象n个锁关键字synchronized取得的锁都是对象锁,而不是把一段代码或方法当作锁。多个线程访问同一对象,哪个线程先执行带synchronized关键字的方法,哪个线程就持有该方法所属对象的锁。多个线程访问多个对象,则JVM会创建多个锁。同步与非同步只有共享资源的读写访问才需要同步化,如果不是共享资源,那么根本没有同步的必要。A线程先持有object对象的Lo...原创 2018-08-15 16:39:46 · 376 阅读 · 0 评论 -
多线程基础知识
进程和线程进程是一次程序的执行,如查看“Windows任务管理器”中的列表,可以将运行在内存中的exe文件理解成进程,进程是受操作系统管理的基本运行单元。线程可以理解成是进程中独立运行的子任务。一个进程可以有多个线程同时运行。多线程实现方式主要有两种:继承Thread类和实现Runnable接口。继承Thread类Thread类实现了Runnable接口。p...原创 2018-08-15 16:17:35 · 711 阅读 · 1 评论 -
锁优化
高效并发是从JDK1.5到JDK1.6的一个重要改进,HotSpot虚拟机开发团队在这个版本上花费了大量的精力去实现各种锁优化技术,如适应性自旋、锁消除、锁粗化、轻量级锁和偏向锁等,这些技术都是为了在线程之间更高效地共享数据,以及解决竞争问题,从而提高程序的执行效率。自旋锁与自适应自旋如果物理机器上有一个以上的处理器,能让两个或以上的线程同时并行执行,我们就可以让后面请求锁的那个线程“...原创 2018-08-01 17:56:54 · 115 阅读 · 0 评论 -
线程安全
定义当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象时线程安全的。Java语言中的线程安全按照线程安全的“安全程度”由强至弱来排序,我们可以将Java语言中各种操作共享的数据分为以下5类:不可变、绝对线程安全、相对线程安全、线程兼容和线程对立。...原创 2018-07-30 18:30:13 · 139 阅读 · 0 评论 -
volatile变量
关键字volatile可以说是Java虚拟机提供的最轻量级的同步机制。当一个变量定义为volatile之后,它具备两种特性,第一是保证此变量对所有线程的可见性,这里的“可见性”是指当一条线程修改了这个变量的值,新值对于其他线程来说是可以立即得知的。而普通变量不能做到这一点,普通变量的值在线程间传递均需要通过主内存来完成。关于volatile变量可见性,经常有如下误解:“volatile变量...原创 2018-07-30 16:55:14 · 715 阅读 · 0 评论 -
java内存模型与线程
硬件的效率与一致性基于高速缓存的存储交互很好地解决另外处理器与内存的速度矛盾,但是也为计算机系统带来更高的复杂度,因为它引入了一个新的问题:缓存一致性。为了解决这一问题,需要各个处理器访问缓存时遵循一些协议,在读写时要根据协议来进行操作,这类协议有MSI、MESI、MOSI等。 Java内存模型主内存与工作内存Java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟...原创 2018-07-30 10:26:40 · 144 阅读 · 0 评论 -
类加载
概述虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的java类型,这就是虚拟机的类加载机制。类从被加载到虚拟机内存中开始,到卸载内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载7个阶段,其中验证、准备、解析3个部分统称为连接。虚拟机规范严格规定有且只有5种情况必须对类进行“初始化”: 1. 遇...原创 2018-07-27 14:55:00 · 159 阅读 · 0 评论 -
类文件结构
概述Class文件是一组以8位字节为基础单位的二进制流,各个数据项目按照顺序紧地排列在CLass文件之中,中间没有添加任何分隔符。当遇到需要占用8位字节以上空间的数据项时,则会按照高位在前的方式分割成若干个8位字节进行存储。根据Java虚拟机规范的规定,Class文件格式采用一种类似于C语言结构体的伪结构来存储数据,这种伪结构中只有两种数据类型:无符号数和表。无符号数属于基本的数据类型,以...原创 2018-07-26 17:16:05 · 102 阅读 · 0 评论 -
jvm调优
64位JDK应用内存问题内存回收导致的长时间停顿现阶段,64位JDK的性能测试结果普遍低于32位JDK需要保证程序足够稳定,因为这种应用要是产生堆溢出几乎就无法产生堆转储快照(因为要产生几十GB乃至更大的Dump文件),哪怕产生了快照也几乎无法进行分析相同程序在64位JDK消耗的内存一般比32位JDK大,这是由于指针膨胀,以及数据类型对齐补白等因素导致的集群优化尽量避免...原创 2018-07-24 17:45:56 · 145 阅读 · 0 评论 -
内存分配与回收策略
对象优先在Eden分配当eden没有足够空间进行分配时,虚拟机将发起一次Minor GC大对象直接进入老年代所谓的大对象是指,需要大量连续内存空间的Java对象,最典型的大对象就是那种很长的字符串以及数组。虚拟机提供了一个-XX:PretenureSizezThreshold参数,令大于这个设置值的对象直接在老年代分配。这样做的目的是避免在Eden区及两个Survivor区之间...原创 2018-07-24 16:05:48 · 110 阅读 · 0 评论 -
垃圾收集算法
标记清除算法首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象复制算法(新生代)将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。这样使得每次都是对整个半区进行内存回收,内存分配时也就不用考虑内存碎片等复杂情况,只要移动堆顶指针,按顺序分配内存即可。 现代主...原创 2018-07-20 18:09:22 · 85 阅读 · 0 评论 -
gc日志
阅读GC日志是处理Java虚拟机内存问题的基础技能。 以下两端典型的GC日志:33.125:[GC [DefNew:3324K->152K(3712K),0.0025925 secs] 3324K->152K(11904K),0.0031680 secs]100.667:[Full GC [Tenured:OK->210K(10240K),0.0149142 secs]...原创 2018-07-20 18:06:56 · 135 阅读 · 0 评论 -
OutOfMemoryError
Java堆溢出Java堆用于存储对象实例,只要不断地创建对象,并且保证GC Roots到对象之间有可达路径来避免垃圾回收机制清除这些对象,那么在对象数量到达最大堆的容量限制后就会产生内存溢出异常。 要解决Java堆溢出异常,重点是确认异常源于内存泄漏还是内存溢出。虚拟机栈和本地方法栈溢出如果线程请求的栈深度大于虚拟机所允许的最大深度,将抛出StackOverflowError异常...原创 2018-07-20 10:39:45 · 156 阅读 · 0 评论 -
new对象
虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。虚拟机将为新生对象分配内存,内存分配方式有两种 指针碰撞:假设Java堆中内存是绝对规整的,所有用过的内存都放在一边,空闲的放在另一边,中间放着一个指针作为分界点的指示器,那所分配内存就仅仅是把那个指针向空闲空间那边挪动一段与对象大小相等的距...原创 2018-07-20 10:22:15 · 195 阅读 · 0 评论 -
Java内存模型
Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。1、程序计数器 当前线程所执行的字节码的行号指示器。 字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。 线程私有:为了线程切换后能恢复到正确的执行位置。 唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的内存区域。2、Java虚拟机栈 ...原创 2018-07-19 11:26:18 · 124 阅读 · 0 评论 -
世界上并没有完美的程序
“世界上并没有完美的程序,但我们并不因此而沮丧,因为写程序本来就是一个不断追求完美的过程。”引自《深入理解Java虚拟机》这本书的第一章节的第一段落。我们先来诠释一下这句话,完美的程序——远大愿景,并不因此而沮丧——乐观包容,追求完美——行动派的宣言。这句话我个人认为在某一层次上是对Java的完全解读。JDK(Java语言、Java虚拟机、Java Api类库):支持java程序开发的最小...原创 2018-07-19 11:25:19 · 1425 阅读 · 0 评论 -
cas
在大多数处理器架构中采用的方法是实现一个比较并交换(CAS)指令。CAS包含了3个操作数——需要读写的内存位置V、进行比较的值A和拟写入的新值B。当且仅当V的值等于A时,CAS才会通过原子方式用新值B来更新V的值,否则不会执行任何操作。无论位置V的值是否等于A,都将返回V原有的值。(这种变化形式被称为比较并设置,无论操作是否成功都会返回。)CAS的含义是:“我认为V的值应该为A,如果是,那么将V的...原创 2018-08-09 17:32:55 · 315 阅读 · 0 评论 -
显式锁
Lock与ReentrantLock与内置加锁机制不同的是,Lock提供了一种无条件的、可轮询的、定时的以及可中断的锁获取操作,所有加锁的方法都是显式的。Lock接口代码如下:public interface Lock{ void lock(); void lockInterruptibly() throws InterruptedException; bool...原创 2018-08-09 17:32:40 · 187 阅读 · 0 评论 -
threadlocal
ThreadLocal 提供了get与set等访问接口和方法,这些方法为每个使用该变量的线程都存有一份独立的副本,因此get总是返回由当前执行线程在调用set时设置的最新值。ThreadLocal对象通常用于防止对可变的单实例变量(Singleton)或全局变量进行共享。例如,在单线程应用程序中可能会维持一个全局的数据库连接,并在程序启动时初始化这个连接对象,从而避免在调用每个方法时都要传递一...原创 2018-08-08 17:05:35 · 260 阅读 · 2 评论 -
线程安全
概述如果当多个程序访问一个可变的状态变量时没有使用合适的同步,那么程序就会出现错误,有三种方式可以修复这个问题: 1. 不在线程之间共享该状态变量 2. 将状态变量修改为不可变的变量 3. 在访问状态变量时使用同步当多个线程访问某个类时,这个类始终都能表现出正确的行为,那么就称这个类是线程安全的。原子性当某个计算的正确性取决于多个线程的交替执行时序时,那么就会发生竞态条件...原创 2018-08-08 17:05:16 · 121 阅读 · 0 评论